Skip to main content

Full text of "Eyrolles - Atmos a la conquête des jeux"

See other formats




MICRO-ORDINATEURS 


ALMOS a La | d 
AONQUÈTE DES JEUX 


Jean Yves QU 










EYROLLES 





ATMOS 


A LA CONQUËTE 
DES JEUX 


«La loi du 11 mars 1957 n'autorisant, aux termes des alinéas 2 et 3 de l'article 41, d'une 
part, que les «copies ou reproductions strictement réservées à l'usage privé du copiste et 
non destinées à une utilisation collective» et, d'autre part, que les analyses et les courtes 
citations dans un but d'exemple et d'illustration, «toute représentation ou reproduction inté- 
grale, ou partielle, faite sans le consentement de l'auteur où de ses ayants droit ou ayants 
cause, est illicite» (alinéa 1°’ de l'article 40)». 

«Cette représentation ou reproduction, par quelque procédé que ce soit, constituerait une 
contrefaçon sanctionnée par les articles 425 et suivants du Code pénal». 


© Éditions EYROLLES, 1984 





ATMOS 
A LA CONQUETE 
DES JEUX 





par 


Jean-Yves ASTIER 


Collection animée 
par Richard SCHOMBERG 





61, boulevard Saint-Germain — 75005 PARIS 


EYROLLES 1984 


SCHOMBERG 
SCHOMBERG 
HERNANDEZ 
NOLLET 
PELLIER 
LADEVIE 
QUEINNEC 
PELLIER 
ASTIER 


MONTEIL 
LEPAPE 
OROS et PERBOST 


PERBOST 

Dax 

NOLLET 

BICKING 

TEJA 
MONTEIL 

PLOUIN 

SAGUEZ 

PELLIER 

ORoS et PERBOST 
GROS 

HARWOOD 
HARTNELL 
HARTNELL et JONES 
VULDY 
BOUQUEROD 
PINSON 

WILLARD 

CEYRAT 
DELANNOY 
AUBERT 

PERBOST et MASSE 
TERRAL 

ASTIER 

MONTEIL 
MONTEIL 


ORos 
WILLARD 
KRUTCH 
ASTIER 
PELLIER 


SAGUEZ et ANDRIEUX 


DE GEETER 
ASTIER 


CROWTHERet HARTLEY - 


MONTEIL 


DANS LA MÊME COLLECTION 


Le Basic Universel. 

Micro-ordinateurs : Comment ça marche ? 
Pascal par l'exemple. 

La conduite du ZX 81. 

La conduite du TRS 80. 

Votre gestion avec BASIC sur micro-ordinateur. 
Langage d'un autre type : LISP. 

Programmez vos jeux d'action rapide sur TRS 80. 
La conduite de l'APPLE II. 

Tome 1 : le Basic de l'APPLE II. 

Tome 2 : le système graphique et l'assembleur de l'APPLE II. 
L'assembleur facile du 6502 et du 6510. 
L'assembleur facile du Z 80. 

ZX 81 à la conquête des jeux. 

CASSETTE - ZX 81 à la conquête des jeux. 
CASSETTE N°2 - 13 jeux 1 K. 

CP/M et sa famille. 

Langage machine, trucs et astuces sur ZX 81. 
La conduite du PC 1212 (ou TRS 80 pocket). 
Apprenez à parler à votre ordinateur. 

La conduite du VIC 20. 

La conduite de l'IBM-PC. 

Télécommande avec votre micro-ordinateur. 
Tout sur les disques du TRS 80 modèles | et lil. 
La conduite du FX-702 P. 

La conduite du PC 1500. 

Jeux et applications pour ZX SPECTRUM. 

Le grand livre du ZX SPECTRUM. 

La conduite du ZX SPECTRUM. 

Graphisme 3 D sur votre micro-ordinateur. 

Des extensions à construire pour votre ZX 81. 
Le Basic en gestion sur Apple Il. 

La conduite du TI 99. 

Mon TI 99/4A. 

Les fichiers en Basic sur micro-ordinateur. 
Pratiquez l'intelligence artificielle. 

VIC 20 à la conquête des jeux. 

La conduite du T O7. 

La conduite de l'ORIC-1. 

Premiers pas en LOGO. 

La conduite du COMMODORE 64. 

Tome 1 : Basic, graphisme et son. 

Tome 2 : Langage-machine entrées/sorties et périphériques. 
La conduite de l’ATARI 400/800. 

T1 99 à la conquête des jeux. 

Expériences d'intelligence artificielle en Basic. 
ORIC à la conquête des jeux. 

Langage machine, trucs et astuces sur ZX SPECTRUM. 
Maîtrisez les interfaces de votre micro-ordinateur. 
Forth par micros. 

ATMOS à la conquête des jeux. 

MO5 et TO7 à la conquête des jeux. 
Introduction à l'IBM-PC Junior. 


LOGILIVRES EYROLLES (logiciels sur cassettes) 


P ELLIER 

PELLIER 

PELLIER 

P ELLIER 
PERBOST et MASSE 
H ADDADI 


Kamikaze (jeu pour ZX Spectrum). 

Astéroïdes (jeu pour ZX Spectrum). 
Othello/Isola (jeux pour ZX Spectrum). 
Éditeur/Assembleur pour ZX Spectrum. 

VIC 20 version de base à la conquête des jeux. 
Calcul des structures sur PC 1500/PC 2. 


Si vous désirez être tenu au courant de nos 
publications, il vous suffit d'adresser votre 
carte de visite au : 


Service «Presse », Éditions EYROLLES 
61, Boulevard Saint-Germain, 


75240 PARIS CEDEX O5, 


en précisant les domaines qui vous intéressent. 
Vous recevrez régulièrement un avis de parution 
des nouveautés en vente chez votre libraire 
habituel. 





Avant-propos 


Grâce à ses incroyables capacités graphiques et sonores, votre 
ORIC est particulièrement doué pour conquérir le monde des jeux sur 
micro-ordinateurs. ‘ORIC/ATMOS à la conquête des jeux’ se pro- 
pose de vous guider dans cette jungle peuplée d'insectes voraces, de 
vaisseaux spatiaux, de couleurs et de sons étranges. | 


La première partie de cet ouvrage contient quinze jeux pour 
ORIC/ATMOS, jeux de réflexion ou d'action, qui bien sûr utilisent les 
dons musicaux et graphiques de votre micro-ordinateur préféré. Tous 
ces jeux fonctionnent sur n'importe quel ORIC/ATMOS standard, il 
n'est pas nécessaire de posséder un joy-stick. 


La seconde partie contient des renseignements qui vous seront 
fort utiles pour programmer vos propres jeux, les trucs et les ficelles 
des modes graphiques, les adresses correspondantes. Vous saurez 
aussi comment est organisée la mémoire de l'ORIC/ATMOS, com- 
ment écrire un programme basic qui fabrique des lignes de pro- 
gramme basic, comment accélérer vos programmes et utiliser le 
langage machine. 


Pour en savoir plus sur l'ORIC, je ne saurais vous recommander 
assez la lecture du livre “L'assembleur facile du 6502”, qui vous 
livrera tous les secret du micro-ordinateur 6502, cerveau de votre 
micro-ordinateur. 


VII 


Table des matières 





ANANEDIODOS 2e UV RES ES Mn era el Ra das SNS VII 
1. Quelques jeux pour ORIC/ATMOS ....................... ] 
ROGUE ARR Se nue ou at aan a l 
RO ROTIBRRS a ie cn ane Ne D NI SUR Re 5 
1 CO AMÉICONS Li au ina td Rte NU Rare 7 
LC aChe AMDON: re Muni horde hais iu 12 
1592 “TOUT AE MONO 5:54: La dur EN AR M Ra dues ent 16 
É0> -Solutionde MHtour dé HANOL ir sait in is ua une 20 
Li CHE ELONOS LE RNA nn Pr Nat a teue 24 
HS: :VOoyase dans l'ÉSDACÉ ss rm iii a ie did éiduee 30 
F0 ONE 4 ne Dual au na te dote Ta edh idtaia 33 
LAID ENCMES 0 2. ile induit silos 39 
LP MU de OPIQUES Le A Radiateur ei … 45 
LA DA Ie HAN MR RL Le dd did ee ua 48 
1:13: Master MIN 55 ia dire aa delai ions 52 
L'IAS PDEAUÉS nds roc amo se troie ec 57 
EDS PET IR UN di een ia mi te bi D ouae 61 
2. Quelques renseignements utiles pour programmer vos jeux ....... 66 
2.1. Gestion de la mémoire de l'ORIC/ATMOS .............. 66 
2.2. Comment redéfinir les caractères ..................... 76 


3. 


2.3. Trucs et ficelles des modes TEXT et LORES ............. 
2.4. Trucs et hicelles du mode HIRES: 53:52 eue 
2.5. Fabriquer des lignes de programme par programme ........ 
2.6 Comment accélérer un programme Basic-................ 
2.7. Un petit exemple de sous-programme assembleur .......... 


ARE en dd aa ali ee idee ailes de 


3:1: Tab: ASCH dé lORIC/ATMOS: 3 els. sinus 
3.2, Tabledes attributs VIdéO ::2::.13 heures auta 
3.3 LetieroprocessEur OM Li ris didier r ie rte 


107 


107 
114 
118 







1 


Quelques jeux 
pour ORIC/ATMOS 





1.1 GLOUTON 


Le glouton est un petit insecte extrêmement vorace, que l’on trouve 
généralement dans les mémoires des micro-ordinateurs. Il se nourrit 
exclusivement de chiffres, qu’il avale goulüment. Pour ce jeu, le glouton 
se déplace sur votre écran, vous le dirigez grâce aux quatre touches 
flèches. Il faut amener l’insecte sur les chiffres qui apparaissent, en 
prenant bien soin d’éviter les étoiles, car le glouton ne les apprécie pas du 
tout. 


Chaque chiffre dévoré vous donne autant de points, il faut bien sûr 
accumuler le plus de points possibles. 


Au début du jeu, un nombre entre 1 et 29 vous est demandé. Il règle 
la vitesse d’apparition des chiffres et des étoiles. Frappez ce nombre, puis 
RETURN. À la fin, on vous demande si vous désirez rejouer. Frappez 
alors la touche ” O” ou ” N°”. 


Avant que vous ne tapiez le programme, voici quelques explica- 
tions sur son fonctionnement. Les lignes 19 à 129 sont des initiali- 
sations : 


49 S est l'adresse-mémoire de la définition du caractère @, qui a 64 
pour code ASCII. Pour faire apparaître le glouton, on va redéfinir @ 
pour qu'il figure l'insecte. 


59 Ces huit nombres sont les valeurs des huit octets nécessaires pour 
redéfinir @ en glouton. 


69 On place en mémoire les valeurs précédentes. Le caractère ‘ @ ‘ est 
remplacé par le caractère ‘glouton. 


89 On fait passer l'écran en mode texte, s'il n'y était pas déjà, la couleur 
de l'écran est verte tandis que celle de l'encre est noire. Le nombre 
64, qui est rangé dans la variable G, est le code ASCII du caractère 
glouton”. Ce code servira dans la suite du programme. 


99 On lit un nombre compris entre 1 et 29, qui est rangé dans F, puis on 
efface l'écran. 


109 Ceci élimine le ‘’plop”’ qui retentit à chaque fois que l’on enfonce une 
touche. Le programme utilise les ordres PING et EXPLODE, aussi le 
“plop” est supprimé afin qu'il n'interrompe pas les bruits de 
clochette et d'explosion, lorsque vous frappez une touche. 


Le jeu lui-même est constitué des lignes 139 à 329. Ce bloc de 
programme est contenu dans une boucle qui débute à la ligne 149 et se 
termine en 329. La boucle est exécutée 1999 fois, après quoi le jeu est 
fini. Nous allons maintenant détailler ce qui se produit à l’intérieur de 
cette boucle. 


159 2@»RND(1) est un nombre aléatoire compris entre @ et 19.9999999. 
Si ce nombre est plus petit que 29-F, on se branche en 199, sinon les 
lignes 169 à 180 seront exécutées. Si par exemple F vaut 1, 29-F 
vaut 19 et le test est en moyenne vérifié 19 fois sur 29. Si F vaut 19, 
20-F vaut 1 et le test sera vérifié 1 fois sur 20 en moyenne. En modi- 
fiant la valeur de F, on peut donc changer le nombre moyen de fois ou 
le test est vérifié. 


Les lignes 169 à 189 font apparaître un chiffre ou une étoile en un 
point quelconque de l'écran. 


169 Q est un nombre compris entre 2 et 39.9999999 tandis que R est lui 
compris entre @ et 26.9999999. Le chiffre ou l'étoile apparaîtra à la 
position (Q,R) de l'écran, qui se trouve en mode texte. 


179 C est compris entre 49 et 57.9999999, Puis, si RND(1)2>.5, ce qui se 
produit en moyenne une fois sur deux, on place 179 dans C. 


180 Il faut se rappeler que les fonctions SCRN et PLOT utilisent la partie 
entière de leurs arguments. Ainsi: 


— Q donne un entier compris entre 2 et 39 

— R donne un entier compris entre @ et 26 

— C donne un entier qui est: 
* soit compris entre 49 et 57 (code ASCII des chiffres 1 à 9) 
+ soit égal à 179 (étoile en inverse vidéo). 


G contient le code ASCII du glouton. Aussi, si le glouton ne se 


trouve pas en (Q, R), on y place le caractère qui a C pour code ASCII, 
c’est-à-dire un chiffre ou une étoile. 


199 


On se préoccupe de savoir si vous avez frappé une touche, on exé- 
cute la lecture du clavier A$—KEY$. Si aucune touche n'a été frappée, 
A$ est une chaîne vide et l’on va en 320. 


Si vous avez frappé une touche, normalement une flèche, on 


exécute les lignes 299 à 319 qui déplacent le glouton suivant la touche. 


200 


210 


220 


230 


249 


260 


270 


280 


290 
300 


On place dans A le code ASCII de la touche frappée. 


Si le code ASCII est celui de la touche ‘flèche à gauche” et si 
l'abscisse X du glouton est supérieure à 2, on décrémente cette 
dernière. 


Si le code ASCII est celui de la touche ‘flèche à droite” et si 
l'abscisse X du glouton est inférieure à 39, on incrémente. 


Si le code ASCII est celui de la touche ‘flèche en bas” et si 
l'ordonnée YŸ du glouton est inférieure à 26, on incrémente Y. 


Si le code ASCII est celui de la touche ‘flèche en haut” et si 
l'ordonnée Ÿ du glouton est supérieure à @, on décrémente Y. 


On met dans V le code du caractère qui est en (X, Y) puis on place le 
glouton en (X, Y). 


(X1,Y1) est la position précédente du glouton, où l'on place un blanc 
pour effacer le glouton précédent. 


Si V est supérieur à 128, on a un caractère en inverse vidéo. On ête 
128 pour obtenir un code ASCII compris entre @ et 127. 


Si V vaut 42, on a rencontré une étoile et on se branche en 34. 


Si l'on n'a pas rencontré un chiffre, de code ASCII compris entre 49 
et 57, on va en 320. 


310 ‘1’ a pour code ASCII 49, "2" est codé par 59, … "9" est codé par 
57. Ainsi V-48 vaut-il 1 si l’on a rencontré ‘’ 1’ sur l'écran, 2 sil'on a 
rencontré 2”. 


Après avoir exécuté le jeu, @ a été remplacé par le glouton. La 


ligne 410 
10 


340 


Note : 


réinitialise l’'ORIC comme lorsque vous frappez ” reset ”. 


REM GLOUT ON % 2 36 26 3636 36 36 36 36 DE DE DE DE DE DE EE 


REM DEFINITION BESTIOLE----------- 
S=46080+8*64 

DATA 33,18,12,12,12,12,18,33 

FOR 1=S TO S+7:READV : POKEI ,V:NEXT 

TEXT:CLS:PAPER 2:INK 0:G=64:P=0 

PRINT :INPUT'"Force (1-20) "3;F:CLS 
PRINT CHRé&(é); 
X=2:Y=2:X1=X:YI=Y:PLOT X,Y,G 


REM JEU------———— 
FOR COUP=1 TO 1000 

IF 20xRND(1)€20-F THEN 190 
G=2+38XxRND( 1) :R=27#RND( 1) 
C=49+9xRND C1 > : IFRND( 12 >. STHENC=1 70 
IF SCRN(G,R)D<>G THEN PLOT G,R,C 
AS=KEYS:IF A$="" THEN 320 
A=ASC(AS) 

IF A=SANDX)2 THEN X=X-1:GOTO 260 
IF A=SANDX<39 THEN X=X+1:GO0T0 260 
IFA=10ANDY {26 THEN Y=Y+1:GOTO Z60 
IFA=11ANDY>0 THEN Y=Y-1:GOTO 260 
GOTO 320 

V=SCRN(X,Y):PLOT X,Y,G 

PLOT X1,Y1,22:Xi=X:Y1=Y 

IF V>128 THEN V=U-128 

IF V=42 THEN 340 

IF V<49 OR U>57 THEN 320 
2AP:P=P+V-48:GOTO 320 

NEXT COUP:WAIT 300:GOT0 350 


EXPLODE :WAIT 300 


le caractère ”£” est à remplacer par ” #7. 


350 CLS:PRINT :PRINT :PRINT :PRINT :PRINT 
360 PRINT SPC(13) ;"Score:"3:P:;CHR$&(6G) 
370 PRINT :PRINT | 

380 PRINT"'Voulez-vous rejouer CO/N) " 
390 GET ÀAS$:IF ÀAS="0" THEN 80 

400 IF AS<>"N" THEN PING:GOTO 390 

410 CALL DEEK(£FFFA) 


Attention à ne pas oublier le ; de la ligne 199. 


1.2 RÉFLEXE 


Connaissez-vous bien la configuration du clavier de votre ORIC ? 
Ce petit jeu va permettre de le vérifier. 


Au début du jeu, on vous demande le délai d’attente maximum. 
Tapez 2.5 puis RETURN. A chaque fois que ZAP retentit, un caractère 
apparaît quelque part sur l’écran. Il faut frapper la touche correspon- 
dante avant que le délai maximum ne soit écoulé. Vour remarquez que 
pendant le jeu le mot CAPS situé habituellement en haut à droite de 
l’écran a disparu. En effet, le clavier est en mode ” minuscules”, les 
touches alphabétiques donnent des lettres minuscules. Pour obtenir une 
lettre majuscule, il faut utiliser SHIFT, tout comme avec une machine à 
écrire. Lorsque vous serez familiarisé avec ce jeu, vous pourrez utiliser 
un délai plus court, par exemple 1.7. 


Voyons maintenant comment fonctionne ce programme. Les lignes 
19 à 170 servent à initialiser le jeu. 


150 32 est le code ASCII du caractère blanc. B$ est donc une chaîne 
constituée de trois caractères blancs, qui sera utilisée en 230. 


169 CHR$(17) supprime le curseur tandis que CHR$(20) fait passer en 
minuscules. 


Les lignes 189 à 249 ont pour but de tirer au hasard un caractère, et 
de l’afficher n’importe où sur l'écran. 


199 On obtient l'abscisse X%X, qui est un entier compris entre 3 et 36. 


200 
219 
220 


230 


249 


On obtient ensuite l'ordonnée Y%, entier compris entre 3 et 23. 
C% est le code ASCII du caractère, compris entre 33 et 125. 


La valeur 96 correspond au caractère (©), qui ne figure pas sur le 
clavier. On tire donc un nouveau code. 


Cette boucle est exécutée trois fois, et remplit de blancs un carré de 
3 x 3 caractères centré en (X%, Y%). En effet, la chaîne B$ contient 3 
blancs. 


Le caractère tiré au sort est affiché, en (X%, Y%). Comme l'on a effacé 
un carré autour de cette position à la ligne précédente, le caractère ne 
peut apparaître collé à un autre qui se trouvait déjà sur l'écran, ce qui 
simplifie le jeu. 


De 269 à 289 on boucle en attendant que vous frappiez le caractère 


qui a été tiré. Si vous ne faites rien, on passe alors à la fin du programme, 
de 39 à 410, qui affiche le nombre de caractères trouvés. 


320 


330 


349 
360 


370 


380 


Le caractère CHR$(10) permet d'obtenir des caractères double 
hauteur. 


convertit le score S en une chaîne de caractères précédée de 
CHRS$(32). 


On élimine le caractère CHR$(32) situé en tête de la chaîne. 


On calcule l'abscisse X où il faut afficher la chaîne pour qu'elle soit 
placée au milieu de l'écran. 


On affiche deux fois la chaîne A$ pour obtenir des caractères double 
hauteur. 


On rétablit le curseur et CAPS qui avaient été supprimés en 160. 


10 REM REFLEXEXxXxX xxx xxx xxx XXE EEE EX Æ 
20 : 

30 PAPER 2Z:INK O0 

40 CLS: PRINT :PRINT:PRINT 

J0 PRINT" Des caracteres ": 

60 PRINT'"'apparaissent" 

#0 PRINT'"'au hasard sur l‘’ecran." 

80 PRINT" I1 faut frapper le plus" 
70 PRINT'vuite possible sur la touche" 
100 PRINT'correspondante." 


110 
1 20 
1:30 
140 
150 
1 60 
1 70 
1eû 
170 
200 
210 
220 
230 
240 
290 
260 
2/70 
280 
290 
300 
310 
320 
330 
340 


410 


PRINT 

PRINT" --dles lettres majuscules" 
PRINT" sS‘’obtiennent avec SHIFT" 
PRINT :INPUT'"'Delai maximum " ; DELAI 
B=32:B$S=CHRS(B) +CHR$SCB) +CHRS(E) 
S=0 CLS: PRINT CHR$&(17) : CHR$&(ZO) 


PING:WAIT 100 
X4=2+ INT (34#RND( 1) 
YA=3+INTE21#RNDC 13) 
CX=33+ INT (93X#RND( 1 )) 

IF C#=96 THEN 210 
FORI=-1TO01:PLOTXA-1,Y%+1,B$:NEXT 
PLOT XX2,YX,C%:2ZAP 


FÜR I=i TO DELAI STEP .002 
IFKEY#=CHRS (C2 THENS=S#+ 1 : GOTO1 80 
NEXT I 


EXPLODE:WAIT 200 

CLS:PAPER 1:INK 7 
AS=CHRS(10)+"SCORE:"+CHRS(B) 
SCHE=STRÉ(S) 
SCH=RIGHTÉCSCE , LEN(SCH)D-1) 
A=AŸ+SCE 
X=18-INT(LEN(ASE)/2) 

PLOT X,11,4$:PLOT X,12,A$ 
PRINT CHR$#(17):CHR$(20) 
PRINT 

PRINT'II fallait frapper ": 
PRINT CHR$(C) 


1.3 CAMÉLÉONS 


Comme chacun le sait, les caméléons sont de petits animaux qui 
ont horreur de se déplacer. Pour se nourrir, ils se contentent d’attendre 
qu’un insecte passe devant eux, il n’y a plus alors qu’à déplier sa longue, 
longue langue pour happer l’insecte et en faire son repas. 


L’ORIC vous demande tout d’abord: Force(1-20)? Frappez par 
exemple 2 puis RETURN. Il apparaît alors 7 caméléons rangés à droite 
de votre écran. Il y a aussi un insecte. Le caméléon situé en face de 
l’insecte (qui est en fait un glouton) doit l’attraper. Vous devez frapper 
deux touches : le numéro du caméléon qui est situé face à l’insecte, puis 
la distance glouton-caméléon. Le numéro du caméléon est un numéro 
compris entre 1 et 7, 1 pour le caméléon rouge, 2 pour le vert, …, 7 pour 
le blanc. La distance glouton-caméléon est comprise entre 1 et 9. 


Ayant précisé qu’il ne faut pas frapper la touche RETURN après 
les deux chiffres, il ne me reste plus qu’à vous souhaiter un bon appétit ! 


Voici maintenant quelques explications sur la structure du 
programme. Tout d’abord, quelques initialisations, de 19 à 129. 


70 MAX est le délai d'attente maximum pour la frappe d'une touche. Cette 
valeur est utilisée en 190 et 220. 


89 On affiche les caméléons. Un caméléon est formé 4 x 2 caractères. 
Les quatre caractères supérieurs sont dans H$, que l'on affiche. On a 
affiché devant le caractère dont le code est |, qui définit la couleur. 


99 On affiche comme précédemment le caractère de code ASCII , qui 
définit la couleur. Puis les quatre caractères inférieurs du caméléon, 
qui sont dans P$, sont affichés. 


Le jeu lui-même est une boucle exécutée quarante fois qui s’étend 
des lignes 149 à 430. 


En 159-169, on calcule la position (X, Y) de l’insecte, que l’on 
affiche à la ligne 179. 


De 199 à 219, on attend que vous frappiez le numéro du caméléon, 
alors que de 229 à 249, on attend la frappe de la distance insecte- 
caméléon. 


De 269 à 280, on vérifie que le numéro est bien compris entre 1 et 
7, que la distance est bien comprise entre 1 et 9, puis ces deux quantités 
sont placées dans les variables A et B. 


De 309 à 399, on déplie et on replie la langue du caméléon. 


300 Y1 est l’ordonnée de la langue, qui est horizontale. 


319 La langue va se déplier de la droite vers la gauche, depuis X1=32 
jusqu'à X1=32—3+B. 


320 Produit une note. 


330 L$ contient un caractère qui forme un élément de la langue. 


340 La langue est dépliée. On note dans V le code ASCII du caractère 
situé juste à gauche de l'extrémité de la langue. Ce caractère est soit 
un blanc soit l'insecte. 


359 La langue va se replier de X1—32—3+B à 32. 
369 Identique à 320. 


379 On affiche V et un blanc, de code 32. 

De 44 à 429, on regarde si le caractère attrapé est 115, c’est-à-dire 
l’insecte. Si oui, on incrémente le score. En 429, on efface la position 
(X, Y), au cas où le caméléon n’aie pas capturé l’insecte, et on fait cesser 
tout bruit. Puis, on continue. 

En 494, l'instruction CALL #F8D0 recharge les deux jeux de 
caractères auxquels vous êtes habitué. 


REM CAMELEONSXXXXXEXXEXEEEXREMXXRXEX 


TEXT : PAPER 0 :1INK 1:CLS:GOSUB 1000 


REM TRACE CAMELEONS ET INITS------ 
CLS : INPUT" Force (1-20) ":F:CLS 
MAX=S3000/(F+5):FOR I1=1 TO 7 

PLOT 33,3%I,1:PLOT 34,3%1I ,H$ 

PLOT 33,3%*1+1,1:PLOT 34,3*x1+1,P$# 


NEXT I:SC=0 


REM JEU---—— 
FOR COUP=1 TO 40:Z=FRE("") 
X=1+INTÉP#RNDC 13) :X=3#X4+1 
Y=1+INTC7#RNDC 12): Y=3%Y 

PLOT X,Y,1$% 


FOR I=i TO MAX 
A$S=KEYS:IF AS<>"" THEN 220 
NEXT I1:GOTO 420 


10 


220 


2930 


450 


910 

1000 
1010 
1020 
1030 
1040 
1050 
1060 
1070 
1080 
1090 
110û 
1110 
1120 


FOR J=1i TO MAX 
B$=KEYS:IF B$<)>"" THEN 260 

NEXT J:GOTO 420 

IF A$<"1" OR A$>"7" 
IF B$<"1" OR B$>"9" 
=VAL (AS) : B=VAL (ES) 
Yi=3%A 

FOR X1=32 TO 32-3xB STEP -1 

SOUND 1,1000/€(X1+3),0:PLAY1,0,7,0 
PLOT X1,Y1,L#:NEXT X1 

V=SCRN(X1 ,Y1) 

FOR Xi=32-3*xB TO 32 

SOUND 1,1000/€(X1+3),0:PLAY1,0,7,0 
PLOT X1,Y1,V:PLOT X1-1,Y1,32 
NEXT Xi 


THEN 420 
THEN 420 


IF V<>115 THEN 420 

PLOT 32,Y1,32:SC=SC+1:2ZAP:WAIT 70 
PLOT X,Y,32:PLAY 0,0,0,0 

NEXT COUP 


PLUT 12,12," Score: "#+5STRSCSC) 

PLOT 6,15,"On recommence (O/N) ?" 
GET ÂA$:IF A$="0" THEN 60 

IF 4$S<)>"N" THEN PING:GOTO 470 
CLS:PAPER 2:INK O:CALL £F8D0 

END 


REM DEFINITION CARACTERESxxxxxxxX 


DATA 33,18,12,12,12,12,18,33 
DATA 0,0,0,0,0,63,0,0 

DATA 0,0,3,14,63,63,15,3 
DATA 0,0,48,24,60,40,25,643 
DATA 0,0,0,0,0,0,60,26 

DATA 6,15,11,10,8,8,8,8 

DATA 2,3,3,7,14,28,56,48 
DATA 55,63,29,55,30,7,0,0 
DATA 63,45,55,31,62,56,0,0 
DATA 8,40,56,56,28,14,7,3 


S=46080+115*8:F=S+10*8-1 
FOR I1=S TO F:REÂD V:POKEI ,V:NEXT 


1130 
1140 
1150 
1160 
1170 
1180 


IB=CHRS (115) :LE=CHRE( 1 1 6) 
H$=CHRS (117)+CHR#Ç118) +CHR&( 119) 
H$=H$+CHRSE ( 1 20 ) 
PS=CHR$(121)+CHR$&C 122) +CHR$& (125) 
P$=P#$+CHRSE( 124) 

RETURN 


Note: le caractère ”£” est à remplacer par ”#”. 





11 


Voici l’aspect du caméléon et dé l’insecte: 








ed L 
Ge 
E. 









1.4 CACHE-TAMPON 


Je suis très fier de vous présenter CACHE-TAMPON, un jeu tout à 
fait original, comme vous allez pouvoir en juger : 


— Pas de caméléon, de glouton, il n’y a rien à manger. Ce jeu est 
reposant pour l’estomac. 


12 


— Aucun dessin. On peut jouer sans regarder l’écran, vous pouvez 
même l’éteindre. Ce jeu est reposant pour les yeux. 


— Aucune stratégie, tactique ou méthode, il n’y a pas à réfléchir. 
Ce jeu est reposant pour l'esprit. 


Le jeu utilise le générateur programmable de sons de l’ORIC, qui 
est capable de produire simultanément trois notes. Imaginez que trois 
objets sont cachés derrière l’écran. À chacun de ces objets est associé 
une note, plus le curseur est proche de l’un des objets et plus la note asso- 
ciée est aiguë. Vous pouvez déplacer le curseur avec les touches flèches, 
il faut l’amener sur les objets cachés. 


Tout d’abord, des lignes 19 à 99, on trouve quelques initialisations. 


30 CHR$(6) supprime le bruit produit par le clavier lorsque l'on enfonce 
une touche. En effet, ce bruit est aussi produit par le générateur pro- 
grammable, il interromprait les trois notes. 


49 8 et 9 sont les codes ASCII des touches ‘’flèche à gauche” et ‘’flèche 
à droite”. On les range dans les chaînes G$ et DS. 


59 De même les codes ASCII des touches ‘flèche en bas” et ‘flèche en 
haut” sont placés dans les chaînes B$ et H$. 


69 X et Y contiennent la position du curseur sur l'écran. X(3) et Y(3) 
servent à stocker la position des trois objets, tandis que F(3) est utilisé 
pour indiquer si les objets ont été trouvés ou non. 


70 à 80 Les coordonnées des trois objets à découvrir sont tirées au hasard 
et stockées dans les deux tableaux. 


La boucle de jeu s’étend des lignes 199 à 289. Il faut déplacer le 
curseur suivant la flèche qui a été enfoncée, regarder si le curseur ne se 
trouve pas sur l’un des objets, calculer la distance du curseur aux objets 
non trouvés, et produire les notes correspondantes. 


119 On affiche le compteur, qui sera vert car on ajoute un caractère 
CHR$(2). CHR$(32) est un caractère blanc, qui sert à effacer le der- 
nier chiffre affiché lorsque l'on passe de 1 400 à 999, de 109 à 99 et 
de 19 à 9. 


120 On lit le clavier et l’on place le caractère lu dans K$. 


130 Si l'on a frappé ‘flèche à gauche”, on décrémente l'abscisse du 
curseur. 


13 


149 


159 


160 


180 


190 


209 


219 
229 


230 


259 


260 


279 


14 


Si l'on a frappé ‘flèche à droite , on incrémente l'abscisse du 
curseur. 


Si l'on a frappé ‘flèche en bas’, on incrémente l'ordonnée du 
curseur. 


Si l'on a frappé ‘flèche en haut ”, on décrémente l'ordonnée du 
curseur. 


La touche lue est affichée, ce qui provoque le déplacement du 
curseur. Il ne faut surtout pas oublier le ; à la fin de l'ordre PRINT, qui 
empêche le renvoi du curseur au début de la ligne suivante. 


Si F(l) vaut 1, cela signifie que l'objet numéro | a été découvert, on 
saute donc en 276, il n'y a rien à faire. 


On calcule la distance du curseur à l'objet numéro I. La dernière 
instruction pourrait aussi s'écrire DX—SQOR(A"2+B"2). Cette écriture 
est, de façon générale, à éviter. En effet, A+A et B+B sont calculés 
plus rapidement que A°2 et B°2. De plus, on obtient des résultats 
plus précis avec A+A et B+B, bien que dans le cas de ce programme 
cela soit sans importance. 


Si la distance n'est pas nulle, l'objet n’est pas trouvé, on va en 25%. 


D% est nul, on vient de trouver l'objet I. On l'indique avec F{l)}=1 et 
on incrémente le nombre N d'objets déjà trouvés. 


L'expression logique F(1) AND F(2) AND F(3) est vraie si les nombres 
F(1), F(2) et F(3) sont tous les trois non nuls, c'est-à-dire si l'on a 
trouvé les trois objets. Dans ce cas, on va en 410. 


SOUND définit la hauteur de la note I. La période de cette note est 
proportionnelle à D%, on obtiendra une note d'autant plus aiguë que 
D% est petit. Le paramètre ‘volume ” de SOUND est à zéro: l'instruc- 
tion définit la hauteur de la note sans la jouer. 


M% est le minimum des distances curseur-objet. Ce nombre servira à 
déterminer la fréquence de répétition du son, en 270. 


Pour jouer la note du canal 1, il faut exécuter PLAY 1, Pour la note 
du canal 2, on exécute PLAY 2, … tandis que PLAY 4, … active le 
canal 3. Si l'on désire obtenir simultanément les canaux 1 et 3, on 
emploie PLAY 1+4,.. tandis que PLAY 1+2,... active les canaux 1 et 
2 et PLAY 1+2+4, … joue les 3 canaux. 

A la ligne 180, on a exécuté PX=—0. Puis on a, en 250, ajouté 1 s'il 
faut jouer le canal 1, on ajoute 2 s'il faut jouer le canal 2 et 4 s'il faut 


jouer le canal 3. Ainsi, en 279, P% contient la valeur adéquate pour 
que seuls les notes correspondants aux objets non trouvés soient 
jouées. 


Les lignes 399 à 449 sont exécutées à la fin du jeu. 


329 Il ne faut pas oublier le ;. Ainsi les messages des lignes 320 et 330 
seront-ils sur la même ligne. 


349 à 389 On reconnaît là l'indicatif de ‘’ Rencontres du 3° type”. 


399 CHR$(6) rétablit le bruit produit par le clavier, qui avait été supprimé 
à la ligne 30. 


. Lorsque vous avez découvert les trois objets, on exécute les lignes 
419 à 450 et l’on recommence le jeu. 


10 REM CACHE-TAMPON x x 3% 2% 2-2 26 DEEE NE NE NE EEE 


30 PAPER 1:INK O:PRINT CHR$#(é6):CLS 

40 W=1000 : GH=CHRS ES) : DÉ=CHRE( 7) 

50 B$=CHRSE (10) : H$=CHRE CS 1 1 ) 

60 X=2:Y=0:DIM X(3),YC3),F(3) 

70 FOR I=i TO 3:XCI1)=INT(38xRND(1))+2 
80 YCI)D=INT(É27#RND 1 ) ) :=NEXT 

70 : 

100 FOR T=W TO 0 STEP-I 

110 PLOTIS6,13,CHR$SC2Z) +STRSCT) +CHR&( 32) 
120 K$=KEYS:1FK$=""THENUWAITI10 :GOTO280 
130 IF K$S=G#SANDX>2 THEN X=X-1 : GOTO1 80 
140 IF K$S=DSANDX<39 THENX=X+1 :GOTO180 
150 IF K$S=B$SANDY<26 THENY=Y+1 :GOTOI80 
160 IF K$=H$SANDY>0 THEN Y=Y-1 : GOTO180 
170 GOTO 280 

180 PRINT K$::P#=0:M#=1000 

190 FORI=3STOISTEP-1:I1F F(I1)=1 THEN270 
200 A=X-X(1):B=Y-YCI) :DA=SGR A *XA+BEXE) 
210 IF D<>0 THEN 250 

220 EXPLODE:F(CI1)=1:N=NtI 

230 IF F1) AND F2) AND FC3)THENAID 
240 GOTO 280 

250 SOUND 1,80*xD7%,0:PA=P4+27(I-1) 


15 


260 IF DÆ<M4 THEN MA=D% 

2/70 NEXT:PLAY P%,0,3,100xM% 

280 NEXT T 

290 : 

300 CLS:PAPER 2:INK 0 

310 FOR I=i TO S:PRINT:NEXT 

320 PRINTSPC(4);"Vous avez trouve ": 
330 PRINTN:'"bidules":PLAY 1,0,7,10 
340 MUSIC 1,3,3,15S:WAIT 80 

330 MUSIC 1,3,5,15:WAIT 80 

360 MUSIC 1,3,1,15:WAIT 80 

3/0 MUSIC 1,2,1,15:WAIT 80 

380 MUSIC 1,2,8,15:WAIT 80 

390 PLAY 0,0,0,0:PRINT CHR$#(é) : END 
400 : 

410 FOR I=i TO 3:F(I1)=0:NEXT 

420 W=INT(2*%W/3) 

430 MUSIC 1,3,10,0:PLAY 1,0,3,1500 
440 WAIT 400:PLAY 0,0,0,0 

450 GOTO 70 


Attention à ne pas oublier le ; de la ligne 189. 


1.5 TOUR DE HANOÏ 


Voici maintenant un jeu de réflexion. Le principe en est simple: on 
dispose d’un support comportant trois tiges verticales et de disques de 
couleurs et de tailles variées. Ces disques sont percés en leur centre, et 
peuvent s’enfiler sur les tiges. Au début du jeu, on empile tous les disques 
sur l’une des tiges, dans l’ordre des tailles décroissantes. Ainsi, le plus 
grand disque est au-dessous de la pile de disques tandis que le plus petit 
est au sommet. Le but du jeu ést de transférer toute cette pile sur l’une 
des deux autres tiges. Cela n’est pas si simple, car vous ne pouvez trans- 
férer d’une tige à une autre qu’un seul disque à la fois. De plus, à aucun 
moment, on ne peut avoir un disque enfilé au-dessus d’un plus petit. 


Voici un exemple avec deux disques: 


16 


Au départ, on a deux disques 
sur la tige de gauche. Il faut 
les amener sur la tige de 
droite. 





1°" coup: On déplace le petit 
disque de la tige de gauche à 
celle du milieu. 





2° coup: On déplace le grand 
disque de la tige de gauche à 
celle de droite. 


3° coup et dernier coup: On 
déplace le petit disque de la 
tige du milieu à celle de 
droite. 





Le programme vous demande tout d’abord: 
Nombre de disques ? 
Tapez 2 puis RETURN. On vous demande alors: 
Tige de départ (0, 1,2)? 
Tapez O puis RETURN. On vous demande encore: 
Tige d’arrivée (9, 1,2)? 


Tapez 2 puis RETURN. L'écran passe en mode haute résolution 
et le support est dessiné. Les tiges sont numérotées de Ÿ à 2. Deux dis- 
ques sont enfilés sur la tige ©. On vous demande: 


Départ, arrivée (9, 1, 2)? 


Tapez, dans l’ordre: 


9,1 return 
9,2 return 
1,2 return 


Vous pouvez recommencer avec plus de disques, le jeu se 
complique à partir de 5 disques. Vous pouvez, au début, partir d’une 
autre tige que celle de gauche, pour arriver sur une autre que celle de 
droite. 


Voici quelques explications sur le fonctionnement de ce 
programme. Les lignes 19 à 129 servent à demander le nombre de 
disques N, le numéro de la tige de départ DE ainsi que celui AR de la 
tige d’arrivée. 


69 Les disques sont numérotés de 1 à N, N est celui de diamètre le plus 
grand. Le tableau TIGE sert à stocker pour chaque tige, les numéros 
des disques qui y sont enfilés. Le tableau T sert à stocker, pour chaque 
tige, le nombre de disques qui ÿ sont enfilés. 


Les lignes 219 à 299 servent à tracer le support et placer les disques 
sur la tige de départ. 


230 On trace une tige verticale. 


249 On trace le numéro de la tige. Pour 11, 1+47 vaut 48, ce qui est le 
code ASCII du chiffre ’@'’. De même, 49 est le code ASCII de 1 et 
59 est celui de 2‘. 


279 Le sous-programme 1919 empile le disque numéro A2 sur la tige 
numéro A1. La boucle 269-289 empile donc tous les disques sur la 
tige de départ DE, en commençant par le plus grand. 


Le jeu lui-même est constitué des lignes 319 à 430. 
350 Si la tige de départ A1 est vide, s'il n'y a pas de disque, il y a erreur, 


on va en 380. 


18 


360 Si la tige d'arrivée A3 est vide, pas de problème, on peut prendre le 


370 


390 


400 


410 


dernier disque de la tige A1 pour le mettre sur la tige A3, ce qui est 
fait en 390. 


On vérifie que le dernier disque enfilé sur A1, celui que l’on va dépla- 
cer, est bien plus petit que le dernier disque enfilé sur A2. Si tel est le 
cas, on va en 394. 


Le sous-programme 2919 dépile un disque de la tige A1. Après 
l'exécution du sous-programme, A2 contient le numéro du disque qui 
a été dépilé. 


Le sous-programme 1919 empile le disque numéro A2 sur la tige de 
numéro A1. Le numéro de la tige d'arrivée, A3, a été placé dans A1 à 
la ligne précédente. 


Si il a moins de N disques sur la tige de numéro AR, ce n'est pas 
terminé, on va donc en 31 pour continuer. 


10 REM TOUR DE HANOI##XXxHXXEXXKKEEREÉEX 
20 ? 

30 TEXT:CLS:PRINT:PRINT 

40 INPUT'Nombre de disques ";N 

50 IF N<1i OR N>i0 THEN PING:GOTO 4û 
60 DIM TIGE(2,N-1)9,7T(C2) 

70 INPUT'"'Tige de depart (0,1,2) "3DE 
80 IF DE<{0 OR DE>2 THEN PING:GOTO 70 
9Q INPUT"'Tige d’arrivee (0,1,29 ";3AkR 
100 IF AR<O OR AR>I2 THEN PING:GOTO 90 
110 IF AR=DE THEN PRINT'P#$f !":GOTO/70 


210 HIRES 

220 FOR I=i TO 3 

220 CURSET&Ox1-40,199,3:DRAW 0,-150,1 
240 CURMOV -2,-15,3:CHAR 1+47,0,1 

Z50 NEXT I 

260 FOR I=N TO 1 STEP -1 

270 ÀAI=DE:A2Z=I:GOSUE 1010 

280 NEXT I 

270 : 

310 REM DEBUT TRAITEMENT ---------———- 
320 INPUT'"Depart,arrivee (0,1,2) ";A1l,A3 


19 


430 

1010 
1020 
1030 
1040 
10Sû 
1060 
1070 
1080 
1090 
1100 
2010 
2020 
2030 
2040 
2050 
2060 
2070 
2080 
2090 
2100 


IF ÀAS<O OR À3>2 THEN PING:GOTO320 

IF A1<0 OR À1>2 THEN PING:GO0OTO320 

IF T{A1)<=0 THEN 360 

IF T(A3)<=0 THEN 390 

IF TIGE(AI,T(A1)-1)<TIGE(AS,T(AG)-1) THEN 39 
£AP:WAIT 30:EXPLODE:GOTO 310 

GOSUB 2010 :A1=ÀA3 

GOSUB 1010 

IF TÉAR)D<N THEN 310 

END 


REM S-PROG EMPILE DISQUEXxxxxxXxxx 
Li=190-10%*T A1) :C1=80x*41+39 
CURSET-/8*%x(A120)-84#x(A12>1),L1,3 
FILL 10,1,42-/*xINTC(A2-1)/7) 


CURSET?72-84#(A120)-78x(A12>1) ,L1,3 
FILL 10,1,7 

GOSUB 2060 
TIGE(A1,T(A1))=A2:T(A1)=T(A1) +1 
RETURN 


REM S-PROG DEPILE DISQUExx*xx*x*#x#2x%x 
T(A1D=T(A1)-1:42=TIGE(AI ,T(A1)) 
Li=190-10%T(A1) :Ci=80xA1 +39 
CURSET-78*%(A1>0)-84%x(412>1) ,L1,3 
FILL 10,1,7 

FOR J=0 TO 9? 

CURSET Ci-3xA2,L1+J,3 

DRAW 6x%A2+1,0,2 

NEXT J 

RETURN 


1.6 SOLUTION DE LA TOUR DE HANOÏ 


Ce programme, qui résoud le problème de la tour de Hanoi, se 
trouve dans tous les manuels d’informatique, car il illustre la notion de 
sous-programme récursif, c’est-à-dire un sous-programme capable de 
s’appeler lui-même. Il peut être intéressant de voir comment ceci peut 
être programmé sur ORIC. 


20 


Le transfert de N disques d’une tige de départ DE à une tige 
d’arrivée AR peut se décomposer en trois étapes. 


1) On transfère N—1 disques de la tige DE sur la tige restante. 


2) Il reste un disque, le plus grand, sur la tige DE. Il n’y a rien sur 
la tige AR, les autres disques sont empilés sur la troisième tige. On trans- 
fère le grand disque de la tige DE à AR. 


3) Il ne reste plus qu’à transférer les N—1 disques restants de la 
tige où ils sont vers la tige AR, et le tour est joué! 


On veut transférer quatre disques sur 
la tige de droite. 


On transfère trois disques sur la tige 
restante, ici celle du milieu. 


On fait passer le grand disque de 
gauche à droite. 


On transfère les trois disques sur la 
tige de droite. 


Le programme correspondant peut être décrit comme suit : 


21 







Programme solution de la tour de Hanoï: 
lire le nombre de disques N 
lire le numéro de la tige de départ DE 
lire le numéro de la tige d'arrivée AR 
exécuter Hanoï (N,DE,AR) 


Fin 


Sous-programme Hanoï (B1,B2,B3): 
si B1 vaut 1 alors: 
dépiler le disque du dessus de la tige B2 
empiler ce disque sur la tige B3 













sinon : 
calculer B4=—numéro de la tige restante, ni B2, ni B3 
exécuter Hanoï (B1—1,B2,B4) 
exécuter Hanoï (1, B2,B3) 

_ exécuter Hanoï (B1—1,B4,B3) 


Retour 






Le sous-programme Hanoï est récursif, ce qui signifie que les para- 
mètres locaux B1, B2, B3 et B4 ainsi que l’adresse de retour L doivent 
être empilées lorsque l’on entre dans le sous-programme. Ce qui est fait 
en 429-459. Il faut aussi dépiler ces quantités en sortie du sous- 
programme, ce qui est fait en 569-580. 


10 REM SOLUTION TOUR DE HANOIXX*x#XxxXxXx%x 


30 TEXT:CLS:PRINT:FRINT 

40 INPUT'"'Nombre de disques ":iN 

50 IF N<i OR N>10 THEN FING:GOTO 4û 
60 DIM TIGEC2.N-1),TC2),PYLEG100) :PP=0 
70 INPUT'Tige de depart (0,1,29 ";DE 
80 IF DE<O OR DE>2 THEN PING:GOTO 70 
90 INPUT'"'Tige d’arrivee (0,1,29 ";AR 
100 IF AR<O OR ÀAR>2 THEN PING:G0OTO 90 
110 IF AR=DE THEN PRINT'P#$f#f !":GOTO/O 
120 : 

210 HIRES 

220 FOR I=i TO 3 

230 CURSETS80*1-40,199,3:DRAW 0,-150,1 
240 CURMOU -2,-15,3:CHAR 1+47,0,1 


7 


250 
260 
270 
280 
270 
310 
320 
330 
340 
410 
420 
430 
440 
450 
460 
470 
480 
490 
900 
910 
520 
930 
940 
900 
960 
9/0 
980 
990 
600 
{1Gi10 
1020 
1030 
1040 
1050 
10460 
10 70 
1080 
1090 
1100 
2010 
2020 


NEXT I 

FOR I=N TO 1 STEP -1 
A1=DE :A2=I :GOSUB 1010 
NEXT I 

RE DÉBUT. TRAETEMENE ESS 
BIi=N:B2=DE:B3=AR:L=1:GO0OTO 410 

END 


REM S-PROG HANOIXKEHEEXKEERXEXEXEXEX 
PYLE(PP)=L:PYLE(PP+1)=B1 
PYLE(PP+2)=B2:PYLE(PP+3)=B3 
PYLE(PP+4)=B4:PP=PP+5 


IF Bi<>1 THEN 510 
Ai=B2:GOSUB 2û010 

A1=B3:GOSUB 1010 

GÜTO Séû 


B4=5-B2-Eb53 

Bi=Bi-1:B3=B4:L=2:GOTO 410 
Bi=1:R3=PYLECPP-2) :L=S3: GOTO 410 
Bi=PYLE(PP-4-1:B2=B4:L=4:G6G0OTO 410 


PP=PP-5 : B4=PYLE(PP+4) 
B3=PYLE(PP+3) : B2=PYLE(PP+2) 
Bi=PYLE(PP+1) :L=PYLE(PP) 

ON L GOTO 330,530 ,540,550 

REM S-PROG EMPILE DISQUExx*x##x%#%x 
Li=190-10%T(A1) :C1=80*xA1+39 
CURSET-78*(A1>0)-84x(A12>1),L1,3 
FILL 10,1,42-7*INT((42-19/7) 
CURSET72-84#(A1>0)-78*x(A12519,L1,3 
FILL 10,1,7 

GOSUB 2060 
TIGE(AI,T(A1D)=A2:T(A1)=T(A1) +1 
RETURN 


REM S-PROG DEPILE DISQUEXxxx*Xxxx xx 
TCALI=T( A1) -1:A2=TIGEC AI ,TCA1)) 


23 


2030 Li=190-10#T(A1) :C1=80*xA1+39 
2040 CURSET-78*#(41>0)-84#(A12>1),L1,3 
2050 FILL 10,1,7 

2060 FOR J=0 TO 9 

2070 CURSET Ci-3*A2,L1+J,3 

2080 DRAW 6*%A2+1,0,2 

2090 NEXT J 

2100 RETURN 


1.7 CHUTES D'ÉTOILES 


Après ces deux programmes sur la tour de Hanoi, nous entrons 
maintenant dans le monde des jeux intersidéraux. Vous êtes maintenant 
le commandant d’un vaisseau intersidéral. Vous traversez un champ 
d'étoiles énergétiques, il faut essayer d’avaler ces particules en plaçant 
votre vaisseau devant, vous disposez des deux touches ” flèche à gauche” 
et ” flèche à droite” pour vous diriger. Attention : certaines de ces étoiles 
clignotent, elles sont en fin de leur existence et risquent d’exploser. II 
convient donc de les éviter. Une particule rouge vous rapporte un point, 
une verte deux points, une jaune trois points, une bleue quatre points, 
une mauve cinq points et une bleu ciel vaut six points. Et maintenant, 
bonne chance! 


Ce jeu utilise le mode LORES 1, qui rappelons-le, est un mode 
TEXT, l’ordre LORES 1 place simplement un caractère CHR$(9) au 
début de chacune des 27 lignes de l’écran. Ce caractère impose au 
système vidéo de l’ORIC l'utilisation du jeu de caractères semi- 
graphiques. Chaque étoile est un caractère semi-graphique de code ASCII 
35, le vaisseau est lui constitué des caractères de codes 33 et 34. 


Le début du programme, de 19 à 169, sert à redéfinir les caractères 
semi-graphiques employés, ainsi que quelques constantes. 


49 B% est le code ASCII du ‘’blanc”, T4 et Q% sont les codes ASCII de 
la tête et de la queue du vaisseau, alors que A% est celui de l'étoile. 

89-99 X% et Y% sont les coordonnées sur l'écran du vaisseau. CHR$(1 7) 
et CHR$(29) suppriment le curseur et le mot CAPS. 


24 


109 G$ et D$ contiennent les codes ASCII des touches ‘flèche à gauche” 
et ‘’flèche à droite’. H$ contient celui de ‘’flèche en haut”. 


119 à 140 Le vaisseau est obtenu en affichant trois chaînes T$(@), T$(1) 
et T$(2). 


_ ft Le 
L Du : 


Les CHR$(9) forcent l’utilisation des caractères semi-graphiques 
non clignotants, ainsi le vaisseau ne clignotera pas lorsqu’une étoile 
clignotante se trouvera à sa gauche. Le CHR$(7) détermine la couleur 
du vaisseau, blanc. | 





Lorsque l’on déplace le vaisseau à gauche, les deux blancs B$ situés 
à droite effacent le vaisseau précédent. Lorsque l’on se déplace à droite, 
le vaisseau précédent est remplacé, effacé par les deux CHR$(7). Enfin 
les quatre blancs de la chaîne T$(2) effacent le bas du vaisseau précédent 
après chaque déplacement vers le bas du champ d’étoiles. 


150 S est l'adresse-mémoire de l'octet qui correspond au 2° caractère de 
gauche de la première ligne de l'écran, elle servira à la ligne 229. Les 
constantes L et M seront aussi utilisées à la ligne 220. 


La boucle de jeu s'étend de 179 à 34. 
199 On tire au hasard un nombre Z% compris entre 2 et 38. 


299 En Z% on place un caractère dont le code ASCII est aléatoire et 
compris entre 1 et 6. C'est un code de couleur, qui détermine la teinte 


25 


219 


229 


239 
249 


259 
269 
270 
289 


des caractères situés après lui sur la ligne. En Z%+1, on met une 
étoile, qui a la couleur définie par le caractère précédent. 


On appelle un sous-programme en langage machine qui déplace 
l'écran d'une ligne vers le bas. 


On place soit un CHR$(9) soit un CHR$(13) au début de la première 
ligne de l'écran. L'étoile qui a été placé sur cette même ligne écran en 
200 sera donc clignotante avec CHR$(13) et fixe avec CHRS(9). 


Lit le clavier. 


Si la touche frappée est ‘flèche à gauche” et si X% est supérieur à @ 
l'expression (C$—G$ AND X%>6) est vraie et vaut —1, on décré- 
mente X%. Si on a frappé ‘flèche à droite’, c'est (C$—D$ AND 
X%X<36) qui vaut —1 et on incrémente X%. 


On trace le vaisseau. 
On regarde si l'on est en face d'une étoile. 
On regarde si l'étoile clignote. 


SCRN(X%+1,Y%—1) donne le code ASCII du code de couleur de 
l'étoile, c'est un nombre compris entre 1 et 6 que l'on ajoute au score 
U%. 


A la ligne 30, on réserve 69 octets pour placer le sous-programme 


machine, ce qui est fait en 1990. 


1910 En #A6-#A7 se trouve la valeur de HIMEM, que l'on range en A. 
1029-1939 On place 55 octets en mémoire à partir de A. 


1940 Le sous-programme situé en À appelle lui-même un sous-pro- 


gramme débutant en A+43. PL contient donc l'adresse de ce 
second sous-programme. En A+26, on trouve une instruction JSR 
vers ce second sous-programme. On place donc en A+21 l'adresse 
de ce second sous-programme. 


* Décalage vers le bas de l'écran en mode TEXT ou LORES: 


A21A A LDX #26 Initialise compteur de lignes. 
A9B8 LDA #5B8 L'adresse mémoire $BFB8 du 
8500 STA Q premier octet de la dernière ligne 
A9BF LDA #$BF de l'écran TEXT est rangée en 
8501 STA 1 Q-1. 

AQ27 Tligne LDY #39 Initialise compteur de caractères. 


26 


A5QQ LDA 
8592 STA 
A591 LDA 
8503 STA 
2O0XXXX JSR 
B1900 Treara LDA 
9192 LDA 
88 DEY 
10F9 BPL 
CA DEX 
19E9 BPL 
AQ27 Ligne@  LDY 
A920 LDA 
9109 boucle STA 
CA DEY 
10FB BPL 
69 RTS 

* Oter 49, nombre d 
A5QQ PL LDA 
38 SEC 
E928 SBÈ 
85909 STA 
B992 BCS 
C691 DEC 
69 Retour RTS 


TO = ND © 
es 


n S 


< < 


Treara 


Tligne 


#39 
#32 
(@), Y 


boucle 


o 


#40 
o 


Retour 


(0) 


L'adresse rangée en (9-1) est 
recopiée. 

en (2-3) 

puis 

on retranche 40 à (9-1). 

Prendre un octet et 

le recopier à la ligne du dessous. 
décrémenter compteur de carac- 
tères 

Si pas nul, continuer la ligne. 
Sinon, décrémenter compteur de 
lignes. 

Si pas nul, passer à la ligne sui- 
vante. 


La 1'° ligne de l'écran va être 
remplie de blancs (code 32). 


‘octet par ligne, à (@-1): 


Prendre l'octet de poids faible. 
Préparer la soustraction. 

Oter 40. 

Ranger l'octet de poids faible. 
Si retenue, retour. 

Sinon décrémenter octet poids 
fort. 


10 REM ETOILESX2x xx 26x66 262 XX XXE EEE EX 


30 HIMEM €£9800-50:GOSUB 1000 


40 B2=32:7/=33:0/%=34 :A4=3S 
90 PAPER O:INK O:LORES 1:S=£fB800+8xTx 


60 S=£BS00+8xTXx 


#0 GOSUB 2000 


80 XX=15:Y/=20 


90 PRINT CHR#(1/7) ; CHR 20) 
100 GS=CHRS (SG) : DE=CHRE( 7) 
110 DIM T#&(C2) : B$=CHR#&(B/) 


</ 


28 


1 20 


270 
300 
310 
320 
330 
340 
390 
360 
37/0 
360 
390 
400 
410 
420 
430 
440 
450 
460 
470 
480 
450 
20 0 
910 
220 


THCO)=CHRS( 93 +CHRE EC 7) +CHRECT A) +BF 
THCI)I=CHRE( 7) +CHRS C7) +CHRÉ CG) +5 
TH(2)=B$+B$+BS+BS 
S=£BBSG+41:L=7:M=13 


REM  DEBUT DU PROGRAMME 
FOR T=i TO 400 

£=3 7 #RND( 1 +2 
PLOT2%,0,i1+6xRND(1) :PLOTZ2/+1,0,À% 
CALL À 

POKE S,L:IF RND{1)<.STHEN POKES,M 
CS=KEYS 

XA=X et € CH=CGHANDXZ > 0) — € CH=DEANDXE < Sé ) 
FOR I=CTO2:PLOTXA ,YA+I ,T$&CI) :NEXT 
IF SCRN(XA+2,Y/#-1)<247 THEN 290 
IF SCRN(1,Y/-19=13 THEN 330 

LAPS UZ=UX + SCRNCXZ + 1, Ye 1) 
Ê=FRE("") 

NEXT T:WAIT 200:G0OT0 350 


REM FIN DU PROGRAMME ----------——- 
FORI=OTO2:PLOT X2+1,Y/+I,1:NEXT 
EXPLODE :WAIT 300 

TEXTSPAPER 2:INK 0:CLS 

PRINT : PRINT : PRINT : PRINT : PRINT 
PRINT SPC(10):"Vous avez aqagne” 
PRINT : PRINT :PRINT 

PRINT SPC(C15): CHR&(27)3:"A";:; 

PRINT CHR#(27):"N"'sU% 

PRINT SPC(15) ;: CHR&(27):"Â";: 

PRINT CHR#(27) 53 "N"sU%: PRINT 
FRINTFSPRINTIEPRINISPOC(SIi97s: "points" 


B= INT CUZ/20) : PRINT : PRINT : PRINT 
IF B=0 THEN SHOOT:GOTO 500 

IF B>5 THEN EXPLODE:GOTO 5é0 
ON B GOTO 510,520,530,540,550 


PRINT'VUous etes nul.":GO0OTG 5680 
PRINT'Pas terrible.":GOTO 580 
PRINT'Bof ...":GOTO 580 


930 


990 

J60 

9/0 

980 

990 

1000 
1010 
1020 
1030 
1040 
1050 
1060 
1070 
1080 
10970 
1100 
1110 
1120 
1130 
1140 
1150 
2090 
2010 
2020 
2030 
204û 
2050 


PRINT'"'Pas mal.":G0OTO 580 


PRINT'Felicitations":G0OTO 
PRINT'Quel 


280 


score !!":GOTO 580 


PRINT'Fantastique ! Formidable !" 


PRINT CHR&(17) ; CHR#( 20) : END 


REM SOUS PROGRAMME MACHINE x* # x xxx 
A=DEEK(£A6) 

FOR I=û TO A+S54:READ V 

POKE I ,V:NEXT 

PL=4+43:DOKE A+21,PL 

RETURN 
DATASAZ,f1A.£A7,€6B8,£85,£€00 ,£A9 
DATA£BF ,£85,£01,€A0,£27,£A5,£00 
DATAL8SS,£02,fA5,€601,£85,£03,£20 
DATA£FF,£FF,£B1,£00,£91,£02,£88 
DATA£10,fF9,£CA,£10,£E7,£A0,€27 
DATA£AY,£20,£91,£00 ,£CA,£10,£FB 
DATA£ 60 

DATA£AS ,€00,£38,£E9,£28,£85,f00 
DATA£BO,£f02,£Cé,£f01,f£f60 

REM CARACTERESR#KEXREEELEXELXXHEXEX 
FORI=STOS+23 : READV : POKEI ,V:NEXT 
DATA 12,12,12,30,45,45,45,45 
DATA 45,45,45,63,45,33,33,33 
DATÉ 0,0,12,30,30,12,0,0 

RETURN 


Note: le caractère ”£” est à remplacer par ” #”. 
Ne pas oublier les ; des lignes 399 et 419. 


29 





1.8 VOYAGE DANS L'ESPACE 


Après CHUTE D’ÉTOILES, nous poursuivons notre voyage dans 
l’espace. Le vide intersidéral est décidément très peuplé, car vous traver- 
sez de nouveau un champ d’étoiles. Mais attention: cette fois-ci, ce sont 
des étoiles très dures, qu’il faut absolument éviter. Vous disposez 
toujours des flèches à gauche et droite pour manœuvrer. Au départ, vous 
avez un crédit de 9, ce qui signifie que vous pouvez percuter neuf étoiles 
au maximum. Il ne me reste plus qu’à vous souhaiter bon voyage! 


30 On efface l'écran, on efface le curseur, le mot CAPS, on supprime le 
‘’plop” produit par les touches du clavier; 


49 Bien qu'il ne soit plus affiché, le curseur existe toujours dans l'ORIC, il 
indique l'endroit où sera affiché le prochain message: L'écran 
comporte 27 lignes, on envoie le curseur sur la dernière ligne de 
l'écran. 


30 


59 


60 


89 
99 


100 


119 


149 


159 


169 
219 


S est l'adresse-mémoire de la première ligne de l'écan. (On ne 
compte pas la ligne où se trouve CAPS). 


H%=—42 est le code ASCII de l'étoile. G$ et D$ contiennent ies codes 
ASCII des touches ‘flèche à gauche” et “flèche à droite”. 


On place trois étoiles sur la dernière ligne de l'écran. 


Comme le curseur est en bas de l'écran, PRINT décale tout le contenu 
de l'écran vers le haut. Puis on lit le clavier. 


Ceci, comme dans le jeu précédent, incrémente ou décrémente X 
selon la touche frappée. 


à 139 On regarde si l'on a rencontré une étoile. Si oui, on décrémente 
le crédit V. 


On fabrique le vaisseau. V est un nombre compris entre 1 et 9. V+48 
est compris entre 49 et 57, ce qui correspond aux codes ASCII des 
caractères ‘1 à 9”. 


On affiche le vaisseau et on incrémente le score. 
On modifie la couleur de facon aléatoire. 


Le caractère CHR$(2) donne au nombre la couleur verte. Pour que 
les mots ‘année lumière...” qui sont à la suite ne soient pas verts eux 
aussi, on affiche CHRS$(3), ces mots seront donc jaunes. 


10 REM VOYAGE DANS L'ESPACEXRXXEXEXREEX 
eÙ : 

30 CLS:PRINTCHRE( 17): CHR 20) ; CHRE( 6) 
40 FOR I=1 TO 27:PRINT:NEXT : PAPER 0 
O0 X=14:Y=26:V=9:S=£fBBAB:L=S8 

60 NA=0 :H7=492 : G$=CHRSE € 8) : DÉ=CHREE 9) 
70 : 

80 FORI=1TOZ:PLOTZ+RNDE 10 #L,Y HA :NEXT 
90 PRINT:K#S=KEYS 

100 X=X+CKS=GEANDX D 1 ) -CKE=DEANDX< 34) 
110 FOR I=0 TO 2 

120 IF PEEK(S+X+I1)=H4 THEN V=U-1{:PING 
130 NEXT:IF LVéi THEN 180 

140 V&="H"+CHRSCV+48)+"H" 

150 PLOT X,0,U#:N2=NZ+ 1 

160 INK 1+7#xRND& 1) : GOTO 8 


31 


32 


1 70 
180 
190 
200 
210 
220 
230 


EXPLODE :WAIT 200:PAPER C:INK 3 
PLOT 9,13,"Vous avez voyage dans” 
PLOT 11,15,"1l'espace pendant" 

PLOT 8,17,CHR#(2) +STR$S (NY) + CHR#( 3) 
PLOT 13,17,"annees lumiere..." 
PRINT-CHRS (17) : CHR$ € 20) ;: CHR C6) 





1.9 CHENILLE 


Voici maintenant un ” classique” des jeux sur micro-ordinateurs : 
Le jeu de la chenille. Une pauvre petite chenille affamée se proméne sur 
votre écran, cherchant sa nourriture. Elle mange des punaises, des 
araignées et des gros scarabées. Votre rôle consiste à guider la petite 
chenille avec les quatre touches fléchées. A chaque fois qu’elle mange 
une punaise, elle grandit d’un anneau. Une araignée la fait grandir de 
trois anneaux, et un scarabée lui donne dix anneaux de plus. Le but du 
jeu est de faire grandir le plus possible la petite chenille. 


Attention: cet animal est très vorace, il avale vraiment tout ce qui 
se présente à ses mâchoires. Il ne faut pas que sa tête passe sur son corps, 
car il se dévore immédiatement et en meurt. De plus, les gros séarabées 
sont très lourds à digérer, la chenille ne peut en manger qu'après avoir 
avalé une araignée, qui contient des sucs digestifs. 


La difficulté du jeu commence à se manifester lorsque l’on atteint une 
longueur d’environ deux cents anneaux: Il faut soigneusement choisir 
son chemin pour éviter d’être pris dans les replis du corps qui occupe une 
bonne partie de l’écran. Pour vous aider, le nombre de scarabées que 
vous pouvez avaler sans risquer l’indigestion est inscrit en rouge en bas 
de l’écran. 


La tête de la chenille, chacun de ses anneaux, la punaise, l’araignée 
et le scarabée sont bien sûr des caractères que l’on a redéfini. 


| | | | | | 





anneau 


anneau 


sen est 


| | 
| | 
| 
| 
| | 
| 
| | 


_—— + — = = = — —_—— — 


+ = — + 
| punaise | 





33 


La difficulté de ce programme réside dans le déplacement de la 
chenille. On ne peut pas déplacer sur l’écran toute la chenille lorsque 
vous frappez une touche, car cela serait beaucoup trop long. Prenons un 
exemple pour montrer comment l’on procède : 


On veut déplacer vers la droite la chenille: 


position 1 





position 2 


On pourrait bien sûr déplacer vers la droite les quatre caractères 
qui représentent la chenille. En fait, partant de la position 1, il suffit de: 


— déplacer la tête vers la droite, 


— mettre un anneau à l’endroit où se trouvait la tête avant son 
déplacement, 


— effacer le dernier anneau. 


On arrive ainsi à la position 2 en trois étapes, et ceci quelle que soit 
la longueur de la chenille. 


Dans la mémoire de l’ORIC, chaque élément I, anneau ou tête, de 
la chenille, est représenté par trois nombres: son abscisse sur l’écran 
S%(I, 9), son ordonnée S%X(I, 1) et un pointeur PX(T). Le pointeur P%(I) 
contient le numéro de l’élément précédent dans la chenille. Au début du 
jeu, on a: 


34 





P%(1)=2 P%(2)=3 









S%(1,9)=1 S%(2, @)=2 S%(3, D)=3 











S%(2, 1)}=1 S%(3, 1)=1 





SX(1, 1)=1 


élément 1 (queue) élément 2 (milieu) élément 3 (tête) 


On a de plus deux variables TÊTE et QUEUE qui contiennent le 
numéro de l’élément qui est la tête et celui de l’élément en queue respecti- 
vement. Au début du jeu, TÊTE=3 et QUEUE=I. Si l’on déplace la 
chenille vers la droite: 


— On fait progresser en suivant le chaînage les contenus de TÊTE 
et QUEUE en exécutant TÊTE=PX(TÊTE) et QUEUE=P%(QUEUE). 


— On place les nouvelles coordonnées de la tête dans l’élément de 
numéro TÊTE. 





P9%{1)=2 P%(3)=1 












S%(3, D)=3 





S%(1,9)=4 S%(2, 9)=2 











S%(2, 1)=1 S%(3, 1)=1 





SX(1, 1)=1 


élément 1 (tête) élément 2 (queue) élément 3 (milieu) 


TÊTE vaut 1 et QUEUE vaut 2. 


Pour déplacer la chenille, on peut seulement modifier le contenu de 
S%(1, 9), SH(1, 1), TÊTE et QUEUE. De façon plus générale, n’importe 
quel déplacement ne modifie que quatre quantités, TÊTE, QUEUE, 
SH(TÊTE, Ÿ) et SXH(QUEUE, 1), quelle que soit la taille de la chenille. 


Pour allonger la chenille d’un élément, on incrémente la variable L, 
qui contient la longueur de l’animal, puis on ajoute l’élément L en queue. 


35 













REM CHENILLE xx 222 2% 3 36 26 36 36 26 36 3 3 x x x à x à x 


GOSUE 1000 
GOSUB 1200 


REM LECTURE CLAVIER----------- _——- 
A$=KEYS:IF A$="" THEN 440 
X=SACTETE,0) :Y=SXCTET, 1) :4=ASC(A#) 
IF A=S8ANDX>2 THEN X=X-1:GOTO 150 


IF A=SANDX<39 THEN X=X+1:G0OTO 150 
IF A=IO0OANDY<25 THENY=Y+1:G0OTO 150 
IF A=11ANDY>O THEN Y=Y-1:GOTO 150 
GOTO 70 


REM DEPLACEMENT CHENILLE--------- 
PLOT SX(TETE,0) ,SXCTETE,1) ,C2 
PLOT SX(QUEUE,0) ,S%(CQUEUE , 1) ,32 
TETE=PÆ(TETE) : QUEUE=P%( QUEUE ) 
SXCTETE,0)=X:SXCTETE, 1)=Y 
VESCRN(X,Y):PLOT X,Y,Ci 


210 
220 
230 
z40 
290 
260 
2/70 
230 
270 
300 
310 
320 
330 
340 
320 
360 
370 
3380 
370 
400 
410 
420 
450 
440 
450 
460 
470 
480 
450 
900 
910 
920 
230 
54 0 
9 90 
J60 
9/0 
180 
970 
éü 0 
610 


IF V>128 THEN V=U-128 

IF V=Ci OR V= C2 THEN 550 

IF V<>C4 THEN 280 

REM PUNAISE-----——————— 
ZAP:LL=1:GOSUB 450:G60T0 440 

IF Vé>C3 THEN 340 

REM ARAIGNEE----————————— 
ZAP:LL=3:GOSUB 650::F=F+1 

MUSIC 1,5,1,0:PLAY 1,1,3,200 

GOTO 390 


IF V<ÿ CS THEN 440 

REM: GROS SCARABEE-------- mme 
F=P-13:1F F0 THEN S50 

MUSIC 1,3,8,0:PLAY 1,1,1,50060 
LL=10:GOSUB 45û | 

PLOT 10,26,"Je peux avaler” 

PLOT 25,26.,STR$(F)2:PLOT 29,26,52 
PLOT 247,268.,09 


REM GENERATION INSECTES---------- 
IF RND(1)2>.08 THEN 70 
V=INT(S1#RND (1 )) 
X=2+38XRND( 1) :Y=26#RNDE 1 ) 

IF SCRN(X,Y)€>32 THEN 70 

V=INT(51 #RNDC 1 3) 

IF Vidé THEN C=C3 

IF V>10 AND V<47 THEN C=CS5 

IF Véii THEN C=Ca 

PLOT X,Y,C:GOTO 70 


REP FERDLI = SSSR Rens ee mr nine 
EXPLODE:PLOTI6,13."Score:" 
LE=STRSE(L) 
LH=RIGHTS(LS,LENCLS)-1) 

PLOT 22,13,L$H:PRINT CHR#<(6G) : 

PLOT 10,15,"On rejoue (O/N) 7?" 
GET A$:IF A$S="0" THEN 460 

IF A$S<2>"N" THEN PING:GOTO 600 


37 


38 


620 
630 
640 
6930 
660 
670 
680 
690 
7/00 
710 
720 
ioüû 
1010 
120 
1030 
1040 
1050 
1060 
1070 
1080 
1090 
1100 
1110 
1200 
1210 
1220 
1230 
1240 
1250 
1260 
1270 
1280 
1290 
1300 


CLS: CALL £F8D0 : END 


REM ALLONGER LA CHENILLE 
FOR J=1i TO LL:l=L+i 
PACL)=QUEUE : PACTETE)=L 
92(L,0)=S/(QUEUE,0) 
SA(L,1)=SZCQUEUE, 1) 


QUEUE=L 
NEXT J 
RETURN 
REM DEFINITION CARACTERES%*xXx3x2%2%%x 
DATA 33,33,30,18,18,30,33,33 
DATA 30,51,33,45,45,33,51,30 
DATA 33,18,12,12,12,12,18.33 
DATA 0,0,18,12,12,18,0,0 
DATA 12,12,45,63,63,45,12,12 
5=46080+122%e 
FOR I=ST0S+39 :READV:POKEI ,V:NEXT 
Ci=122:C2=123:C3=124:C4=125 
CS=126:DIM S4(600,1),P%<600) 
RETURN 
REM INITIALISATIONSEXX#EXXXHEXNRXX 
TEXT:PAPER 2:INK O:CLS 
L=S3:F=0:PRINT CHR (6): 
FOR I=i TO L 
SACI,0)=1+1:S2CI1,1)=1 
PACID=I+1:PLOT 1+1,1,C2:NEXT I 
FA(L)=1i:TETE=L : QUEUE=1I 
PLOT L#E ft: CIIPLOT 152651 
PLOT 10,26,"Je peux avaler" 
PLOT 25,26,48:PLOT 29,26,05 
RETURN 


Note: le caractère ”£” est à remplacer par ” #”. 


L'ordre CALL #F8D0 de la ligne 620 recharge les deux jeux de 
caractères de l’'ORIC/ATMOS. 





1.10 ENCLUMES 


À la suite d’une dispute avec l’un de vos voisins, vous décidez de 
lancer sur sa maison des projectiles à l’aide d’une catapulte. Mais que 
lancer ? Il faut en effet des objets assez lourds, capables de produire en 
tombant suffisamment de dégâts. Votre choix se porte sur un stock 
d’enclumes, acheté d’occasion. 


Avant chaque tir, il faut régler la catapulte, pour fixer d’une part la 
vitesse de départ de l’enclume et d’autre part l’angle de départ par 
rapport à l’horizontale. Le tir est compliqué par la présence d’une 
montagne et par du vent, qui dévie la trajectoire. 


À chaque tir, il faut donner la vitesse initiale exprimée en mêtres/- 
seconde, l’angle de départ en degrés. La vitesse du vent est positive s’il va 
vers la droite de l’écran, négative s’il va vers la gauche. 


Voici quelques explications sur le fonctionnement de ce 
programme. Les lignes 39 à 69 servent à définir le caractère qui représen- 
tera l’enclume. 46592 vaut 46080+8*64, ce qui signifie que l’on a redé- 
fini le caractère de code ASCII 64. 


39 





Les lignes 89 à 199 servent à tracer la montagne de pente H. De 
119 à 149 on trace le versant gauche tandis que le versant droit est 
déssiné de 159 à 189. A la ligne 189, on place en bas à droite de l’écran 
un caractère CHR$(17) sur neuf lignes. Ce caractère donne à l’écran la 
couleur rouge. 


Le bloc 299 à 329 sert à initialiser la position (X, Y) du projectile 
ainsi que sa vitesse (VX, VY). On tire aussi au hasard la vitesse V du 
vent. G=—9.81 est l’accélération de la pesanteur. 


La trajectoire est calculée point par point, en utilisant une méthode 
d'intégration numérique d’ordre deux. Le projectile est soumis à l’accé- 
lération de la pesanteur et à une trainée aérodynamique proportionnelle 
au carré de sa vitesse V1 par rapport à l’air. 


De 339 à 399 on calcule un point. 
349 V1 est la vitesse de l'enclume par rapport à l'air, tandis que G1 est la 
décélération due au frottement aérodynamique. 
359 DT est le pas de calcul. 
369 On calcule les composantes GX et GY de l'accélération du corps. 
370 On calcule les composantes VX et VY de la vitesse. 
389 On obtient alors la nouvelle position (X, Y) 


Les lignes 499 à 599 affichent l’enclume, en vérifiant qu’elle n’est 
pas sortie de l’écran et qu’elle n’a pas percuté la montagne. 


40 


Enfin, les lignes 519 à 559 terminent le programme. 


10 REM JEU D'’ENCLUMESX##X#HEHXEXERXXR XX 
20 : 

30 REM DEFINITION FORME ENCLUME------ 
40 DATA 0,30,63,30,12,30,0,0 

O0 TEXT:FOR 1=46592 TO 44599 

60 READ L':POKE I ,V:NEXT 


80 REM TRACE MONTAGNE ----———————————— 
90 PAPER 2Z2:INK 4: H=RNDI 10 #1.5+,.2 

100 HIRES:P4PER 2Z:INK à 

110 FOR 1=40 TO 117 

120 J=INT(CI-40)*H+15SERNDC1))+1 

130 (CURSET 1:177,32:DRAW''0:;,;-9.,1 

140 NEXT I 

150 FOR I=120 TO 199 

160 J=INTC(199-1)#H+1S5xRNDC1))+1 

170 CURSET 1,199,3:DRAU 0 ,-J,1 

16D NEXT TiCURSET222-170,S:FILET:F.17 
190 : 

200 REM INITIALISATIONS-------———————— 
210 X=0:Y=0:K=.005:6=9,.81 

220 V=(RND(1)-,5)%5 

230 PRINT'UENT:":U | 
240 PRINT'"'DONNER LA VITESSE INITIALE" 
250 INPUT VO 

2OÙ0 PFRINT"'VENT: "AVS" VOST UD 

270 PRINT'"'DONNER L'ANGLE DE DEPART" 
280 INPUT À:PRINT 

LU: PRINT VENTES SUR" VOD" SU0DErE" Ar" A 
300 A=4/180xPI 

310 VX=VO0OXCOS( A) :UY=UDXSIN(A) 


so0 RKEM CALCUL TRAJECTOIRE-=--e-e-SS 
340 VI=SQR(EUX-U)T24+UY" 2) :GI=K&VI "2 
390 DT=15/V1+.1:D2=DT" 2/2 

360 GX=-(UX-U)/UIXG1 : GY=-VY/U1#6G1-6G 
370 VX=UX+GXX#DT :UYEUY + GYxDT 

380 X=X+UXEDT+GXE#D2:Y=Y+UYXDT+GY*#D2 


41 


370 

400 REM. AFFICHÂGE----———————————————— 
410 2=199-Y:1F 2192 THEN 440 

420 IF X>220 AND X<233 THEN Siû 

430 PING:WAIT 200:GO0OT0 100 

440 IF X<6 OR X>233 OR Z<0 THEN 340 
450 IF POINTEIX,2)=0 THEN 470 

460 EXPLODE:WAIT 300:GOTQ0 100 

470 CURSET X,2,0:CHAR 64,0,1 

480 SOUND 1,10000/(200-2),0 

490 PLAY 1,0,4,100:GOT0 340 

o0Q : 

910 REM COUP AU BUT ---—-———————— mm — 
920 PAPER 1:CURSET X,192,3 

JS0 CHAR 64,0,1:2ZAP:WAIT 40:EXPLODE 
9540 PRINT:PRINTSPC(27):"Sprotch !!" 
550 WAIT 400 :SHOCT 





1.11 MUR DE BRIQUES 


Chapeau bas. J’ai l'honneur et l’avantage de vous présenter l’un des 
ancêtres, l’un des pionniers des jeux vidéos, le jeu de mur de briques. En 
face de vous se trouve un mur de 499 briques. Vous avez une raquette, et 
vous devez sans cesse renvoyer une petite balle qui casse les briques sur 
lesquelles elle rebondit. Le but est bien sûr de casser les 499 briques. 


Les touches ” flèche à gauche” et ”’flèche à droite” déplacent la 
raquette, tandis que ” flèche en bas” incline cette raquette vers la gauche 
et flèche en haut” l’incline vers la droite. Ainsi, la raquette peut avoir 
cinq inclinaisons différentes, et l’on peut renvoyer la balle dans une autre 
direction. 


La tactique consiste à percer le mur de part en part, puis d'envoyer 
la balle dans le trou, pour qu’elle arrive entre le haut du mur et le haut de 
l’écran. Elle rebondit alors sur le haut de l’écran et sur le mur, en détrui- 
sant une brique à chaque fois. 


Ce jeu utilise le mode haute résolution HIRES. Les principales 
variables utilisées sont : 


— X, Y: position de la balle sur l'écran. 
— VX, VY: vitesse de la balle. 

— XR, YR: position de la raquette. 

R : angle de la raquette. 


— MG, MD, MB et MH sont les marges gauche, droite, basse et 
haute de l’écran. 


— AS, B$, C$ et D$ contiennent les codes ASCII des touches 
flèches. , 


Le fonctionnement du programme est le suivant : 


30 Lesinitialisations sont laissées à la responsabilité du sous-programme 


500. 
La boucle de jeu est constituée des lignes 59 à 259. 


59 On lit le clavier. Si une touche flèche n'a pas été frappée, il n'y a pas à 
modifier la position ou l'angle de la raquette et on va en 190. 


43 


69 


79 


89 
99 


199 


119 


149 


179 


Les lignes 69 à 189 modifient la position ou l’angle de la raquette. 


On commence par effacer l'ancienne raquette en yÿ plaçant le carac- 
tère B. 


Si on a frappé ‘’flèche en haut”, il faut incliner la raquette à droite, J1 
est l'incrément angulaire que l'on va ajouter en 119 à l'angle R. 


Si on a frappé ‘flèche en bas”, il faut incliner la raquette à gauche. 


Si on a frappé ‘flèche à droite”, il faut déplacer à droite la raquette. 
|1 est l'incrément que l'on va ajouter en 149 à XR. 


Si on a frappé ‘flèche à gauche”, il faut déplacer à gauche la 
raquette. 


à 139 On modifie l'angle R de la raquette en vérifiant que l'on ne sort 
pas des limites —RM, +RM. 


à 169 On modifie la position XR de la raquette en vérifiant que l'on 
ne sort pas de l'écran. 


On affiche la raquette. INT(R/J2) vaut —2, —1,@, 1 ou 2 selon l'angle 
de la raquette. 


Les lignes 199 à 259 déplacent la balle. 


199 On calcule les nouvelles coordonnées XA et YA. 

209 Si l'on sort de l'écran par la gauche ou la droite, on va rebondir en 
350. 

219 Si l’on sort de l'écran par le haut, on va aussi rebondir en 35. 

229 Si l'on sort de l'écran par le bas, on va en 320. 

230 Si l'on a rencontré une brique, on va en 2760. 

249 On efface l'ancienne balle en X, Y on trace la nouvelle en XA, YA. 

259 Après avoir transféré (XA, YA) dans {X, Y). on recommence. 
Les lignes 279 à 319 sont exécutées lorsque l’on rencontre une 

brique. 

279 On calcule les coordonnées X1, Y1 de l'angle supérieur gauche de la 
brique rencontrée. 

289 On efface cette brique. 


di 


299 On incrémente le nombre NB de briques cassées et on regarde s'il est 
égal au nombre total NT de briques. | 


309 On affiche NB. 


319 On nettoie la mémoire et on va rebondir sur la brique en 350. 


329 On arrive à cette ligne lorsque l'on sort de l'écran par le bas. Si de 
plus la balle n’est pas dans la raquette, on va en 1500. 


Les lignes 359 à 429 servent à calculer les nouvelles vitesses VX et 
VY après un rebond sur un plan faisant un angle A avec l'horizontale. 


Le sous-programme 59%-99f réalise toutes les initialisations néces- 
saires, variables, constantes et caractères. 


Les lignes 1990 à 1199 sont exécutées lorsque l’on a détruit toutes 
les briques, tandis que les lignes 1599 à 1580 servent lorsque la balle est 
passée à côté de la raquette. 


REM MUR DE BRIQUESXX#xX2%xX32 3x2 XX EX XX 
GOSUB 50û 


TH=KEYS:IF TÉ<D$S OR TE)AS THEN 170 
CURSET XR,YR,3:CHAR B,0,0 

IF T$=A$ THEN Ji=J2:GO0OT0 110 

IF T$=B$ THEN Ji=-J2:GO0OT0 110 

IF T$=C$ THEN I11=12:G0OT0 140 


IF T$=D$ THEN Ii=-I12:GOT0 140 
R=R+JI1:1F R<-RM THEN R=-RM 

IF R>RM THEN R=RM 

GOTO 170 

XR=XR+11:I1F XR<MG THEN XR=MG 
IF XR>MD-7 THEN XR=MD-7 
CURSET XR,YR,3 

CHAR 12S+INT(R/J2),0,1 


XA=X+UX DT : YA=Y+UY DT 

IF XA<MG OR XA>MD THEN À=PI : GOTO3SO 
IF YA<MH THEN À=0:G0OTO 350 

IF, YA>MB THEN 320 

IF POINT(IXA,YA)=-1ANDYA<M THEN270 


45 


46 


240 
250 
260 
270 
280 
290 
300 
310 
320 
330 
340 
390 
360 
3/0 
380 
3970 
400 
410 
420 
430 
90 0 
9310 
920 
9330 
940 
990 
J 60 
9/0 
980 
990 
600 
610 
620 
630 
640 
650 
660 
670 
680 
6TÛ 
700 
71üû 


CURSET X,Y,0:CURSET XA,YA, 1 
X=XA:Y=YA:GOTO 50 


XI=6kINT(XA/6) :YI=ékINT(I YA 6) 
CURSET X1,Y1,3:FILL 6,1,64 
NEB=NB+1:PRINT:IF NB=NT THEN 1000 
PRINT'Briques cassees: ":NB:EXPLODE 
A=Û0 :;: Z=FREC""):GOÜTO 3Sû 

IF XA<XR-1 OR XA>XR+7 THEN 1500 

A=R 


=UX#COSCA) +UY#SINCA) 
UY=UX#SINCA)-UY#COSC A) : VX=U 
XA=XA+UXXDT : YA=YA+UY YDT : PING 
IF XA<MG THEN XA=MG 

IF XA>MD THEN XA=MD 

IF YA<MH THEN YA=MH 

IF YA>MB THEN YA=MB 

GOTO 240 


REM INITIALISATIONSXRXxxXxXxXxXERXEXRXE 
TEXT:PAPER 2:INK 0 
HIRES :RESTORE 


A$=CHR$S( 11) FLECHE EN HAUT 
B$=CHR$S(10)’ FLECHE EN BAS 
C$=CHR$(T)' FLECHE À DROITE 
DÉ=CHR$S(S)’ FLECHE à GAUCHE 
PRINT : INPUT"Force (1-5) ":DT 

IF DT<i OR DT>S5 THEN PING:GOT0590 


X=120:Y=195" POSITION BALLE 
A=C(RND(1)-3/2) *PI/2 

VX=COS (A) :UY=SIN(AD VITESSE BALLE 
XR=120 :YR=192" POSITION RAQUETTE 


MG=0 :MD=239° LIMITES DE 
MB=199:MH=0" L'ECRAN 
M=100° MILIEU DE L'ECRAN 


R=0” ANGLE RAGUETTE 


720 
730 


700 


780 

990 

1000 
1010 
1020 
1030 
1040 
1050 
1060 
1070 
1080 
1090 
1100 


J2=PI1/36’ INCREMENT ANGLE RAGUETTE 
12=3*INCREMENT POSITION RAQUETTE 
RM=J2*%2"ANGLE MAXIMAL RAGQUETTE 


NT=40*10’NOMBRE TOTAL DE BRIQUES 
NB=0 NOMBRE DE BRIQUES CASSEES 
REM DEFINITION RAGUETTES--------- 
DATA 0,0,0,3,12,48,0,0 

DATA 0,0,0,0,7,56,0,0 

DATA 0,0,0,0,0,63,0,0 

DATA 0,0,0,0,56,7,0,0 

DATA 0,0,0,48,12,3,0,0 

S=f9800 

FOR A=5+123*8 TO S+127*x8+7 

READ U:POKE A,Ù 

NEXT À 


REM DEFINITION CARACTERE BLANC--- 
B=é4 
FOR A=S+é4x8 TO S+é4x5+/ 


POKE À,63 

NEXT À 

CURSET 9,6,3:FILL 60,40 ,63 
CURSET XR,YR,3:CHAR 125,0,1 


RETURN 

REM GAGNEXKEXXEXERERRERERENREXÉXX 
TEXT : CLS : PRINT : PRINT 

PRINT CHR 4) 

PRINT SPC(12) ; CHR$&( 27); "N°: 
PRINT CHR$(27)93:; "AB R À V O0" 
PRINT : PRINT : PRINT 

PRINT SPC(10):CHRS(27)3:"J"; 
PRINT CHR$#(27)3;"EPLUS DE BRIQUE" 
PRINT CHR#(4) : PRINT: PRINT 

GOTO 1530 


47 


1500 REM PERDUXXXXXXXEXEXEXXXAEXEXXX XX 
1510 PRINT'SCORE FINAL:":;CHR$(27);"A": 
1520 PRINT NB; CHR#$(27):;"à"3:"BRIQUES" 
1530 PRINT'"'VUoulez-vous rejouer <CO/N) " 
1540 INPUT T$ 

1550 IF T$="0" THEN 10 

1560 IF T$<>"N" THEN PING:GOTO 1530 
1570 TEXT:CALL £F8D0 :END 

1580 : 


Note: le caractère ”£” est à remplacer par ”#”. 


1.12 BATAILLE NAVALE 


Ce jeu vous permet de jouer à la bataille navale en solitaire, l'ORIC 
se charge de placer les bateaux. Pour tirer, il vous suffit de frapper les 
coordonnées de l’endroit visé. D’abord, taper une lettre comprise entre A 
et J, puis un chiffre compris entre Ÿ et 9. 


L’ORIC a placé dans la grille un porte-avion (4 cases), deux croi- 
seurs (trois cases), trois torpilleurs (deux cases) et quatre sous-marins 
(une case). 


Les bateaux ne peuvent se toucher. Après chaque tir, l’'ORIC vous 


indique ”’à l’eau”, touché” ou ” coulé”. 


Voici quelques explications sur le fonctionnement de ce programme. 
Tout d’abord, quelques initialisations, de 19 à 69. 


49 CLEAR sert lorsque l'on rejoue, il efface toutes les variables, ce qui est 

un moyen de les remettre à zéro. Le tableau JEUS% sert à y placer les 
bateaux. Bien que la grille fasse 19x19, ce tableau fait 12x12. Ceci 
pour simplifier la programmation du jeu. Le tableau COULES%S sera 
progressivement rempli de ‘’@'’ au fur et à mesure que des bateaux 
seront coulés. 


De 89 à 159, on dessine la grille de jeu. 


199 On place en (19,1) un caractère 16 qui donne à l'écran la couleur 
noire, jusqu'à ce que l’on rencontre le caractère 29 placé par l'instruc- 
tion suivante, qui redonne à l'écran la couleur bleue. 


48 


130 


200 


210 
229 
230 
249 
259 


300 


350 


419 
429 
430 


440 


Lorsque | varie de 2 à 11,1+46 varie de 48 à 57, on obtient donc les 
codes ASCII des caractères ‘’O@'’ à 9”. 1+63 donne lui les codes 
ASCII des caractères À à J. 


Le bloc 169-389 place les dix bateaux dans la grille. 


La variable H permet de décider si le bateau sera horizontal (H——1) 
ou vertical (H=—(). 


X est l'abscisse de la case supérieure gauche du bateau à placer. 
Y est l'ordonnée de cette case. 

XF est l'abscisse de l’autre extrémité du bateau. 

YF est l'ordonnée de l'autre extrémité du bateau. 


à 290 On vérifie que les cases situées autour du bâtiment sont bien 
vides, que le bâtiment n'en touche pas un autre. Si tel n'est pas le 
cas, on va en 200, il faut placer ailleurs le bâtiment. 


à 340 On place le bateau dans la grille. Le chiffre des dizaines de 
1@+TYPE+N est TYPE et indique le type du bâtiment tandis que le 
chiffre des unités est N et indique le numéro du bâtiment. On peut 
ainsi stocker deux données dans une même variable. 


On stocke dans COULES la longueur du bâtiment. 
Les lignes 399 à 449 lisent le tir. 


On lit un caractère. Si ce n'est pas une lettre comprise entre À et K, 
on recommence. 


On affiche la lettre, et l'on calcule l'abscisse X du tir, comprise entre 1 
et 19. 


On lit un caractère. Si ce n’est pas un chiffre compris entre O et 9, on 
recommence. 


On affiche le chiffre, et l’on calcule l'ordonnée Ÿ du tir, comprise entre 
1 et 19. 


De 469 à 499, on regarde si le tir a touché quelque chose. Si non, 


on place un point sur l'écran. 


519 
520 


Le bloc 519 à 550 est exécuté lorsqu'un bateau est touché. 


On détermine le type du bateau touché. 


On détermine le numéro du bateau touché. 


49 


539 On fait disparaître de la grille la case touchée. 
549 On décrémente la longueur du bateau. 


559 On fait apparaître sur l'écran un chiffre compris entre 1 et 4, qui 
indique la taille du bateau touché. 


De 569 à 599, on affiche le message approprié à la situation. Si la 
longueur du bateau est réduite à zéro, ce bâtiment vient d’être coulé. 


De 619 à 650, on regarde s’il reste des bateaux à flot. 


10 REM BATAILLE NAVALE x*x%3#32#32% 3263263232 X 2% XX XX 
20 : 

30 REM INITIALISATIONS-------------—- 
40 CLEAR:DIM JEUX 11,11) ,COULEZ(4,4) 
OÙ PAPER 4:INK 7 

60 CLS 


80 REM DESSIN DE LA GRILLE----------- 
90 FOR 1=3 TO 23 

100 PLOT 10,1,16:PLOT 31,1,20 

110 NEXT 1! 

120 FOR I1=2 TO 11 

130 PLOT 8,2*%I1,1+46:PLOT 7+2%1,1,1+63 
140 NEXT 1 


160 REM ON PLACE LES BATIMENTS-----—- 
170 PLOT 10,25,"Je place les bateaux" 
180 FOR TYPE=4 TO 1 STEP-1:UV=TYPE-I 
1790 FOR N=i TO 5-TYPE 

200 H=-ji:I1F RND(1)>,.5 THEN H=0 

210 X=1+INTCC10+U#H) xRNDÉ 1 2) 

220 Y=I1+INTÉCIO0O+UXC(NOT H))#RND( 10) 
230 XF=X-Hxl 

240 YF=Y-CNOT H)æxt 

250 FOR I=X-1 TO XF+1 

260 FOR J=Y-1 TO YF+1 

2/0 IF JEUX(I,J)<>0 THEN 200 

280 NEXT J 

290 NEXT I 


50 


300 
310 
320 
330 
340 
350 
360 
3/0 
380 
390 
400 
410 
420 
430 
440 
450 
460 
470 
480 
490 
900 
910 
920 
930 
540 
990 
J99 
960 
3/0 
380 
9390 
600 
610 
620 
630 
640 
690 


FOR I=X TO XF 

FOR J=Y TO YF 
JEUX(I ,J)=TYPE#10+N 
NEXT J 

NEXT I 

COULEZX(TYPE ,N)=TYPE 
NEXT N 

NEXT TYPE 


REM DÉBUT DL JE 
PLOT 10,25,"Que jouez-vous: : 
GET AS:IF AS<"A"ORAS)>"K" THEN 400 
PLOT 28,25,A$:X=ASC(AS) -64 
GET AS:I1F ÀAS<"CO"ORAS:" 7" THEN 400 
PLOT 29,25,A$H:Y=ASCCAS) -47 


IF JEUZ(X,Y)€>0 THEN 510 

PLOT 2xX+9,2#%Y+2,",." 

PLOT 10,25," À l’eau. " 
WAIT 200:GOT0 400 
TYPE=INT(JEUZ(X,Y)/10) 
N=JEUZ(X,Y)-10xTYPE 

JEUZ&X ,Y)=0 

COULECTYPE ,N)=COULEZCTYPE ,N)-1 
PLOT 2xX+9,2xY+2,TYPE+48 


EXPLODE : IFCOULEXCTYPE ,N)=0THENS9G 


PLOT 10,25," Touche. » 
GOTO 610 

PLOT 10,25," Coule !! " 
WAIT 200 

FOR I=1i TO 4:FOR J=1 TO 4 


IF COULEX(I1,J)<>0 THEN 400 
NEXT J:NEXT I | 
PLOT 10,25," GAGNE !'!: : 


1 


1.13 MASTER MIND 


Le master mind est un jeu de réflexion auquel vous allez pouvoir 
Jouer avec votre ORIC. La règle du jeu est la suivante : L'ORIC choisit 
une combinaison de pions qu’il vous faut découvrir. 


Chacun de ces pions peut être rouge, vert, jaune, bleu, mauve ou 
cyan. Il vous faut découvrir la couleur et la position de chacun des pions. 
À chaque coup, vous proposez une combinaison. L’ORIC vous répond 
en plaçant sur l’écran une petite marque noire pour chaque pion de la 
bonne couleur à la bonne place. Puis l'ORIC ajoute une petite marque 
blanche pour chaque pion de la bonne couleur qui n’est pas à la bonne 
place. A l’aide de ces indications, il faut trouver la combinaison cachée 
en le moins de coups possible. 


Au début du jeu, on vous demande le nombre de pions à découvrir. 
Tapez 4, 5 ou 6 puis frappez RETURN. 


À chaque coup, les touches ” flèche à gauche ” et ” flèche à droite” 
vous permettent de déplacer le curseur, qui a quatre positions possibles, 
celles des pions. Les touches R, V, J, B, M et C font apparaître un pion à 
l'emplacement du curseur. Lorsque vous avez placé dans la grille vos 
pions, frappez RETURN. Si vous abandonnez, frappez ESC. 

Tout autre touche efface le pion sur lequel se trouve le curseur. 


Voici quelques précisions sur la structure du programme. Des 
lignes 39 à 49, on trouve les initialisations nécessaires au jeu. 


De 49 à 90, on définit les deux caractères représentant le pion et la 
marque. 


De 139 à 149, on définit le grand rectangle noir qui servira de grille 
de Jeu. 


De 169 à 199, on trace le petit rectangle sur lequel le mot ” master 
mind” est inscrit. 


De 219 à 230, on définit les différentes couleurs. 


De 259 à 319, on trace un rectangle noir dans lequel on affiche les 
couleurs possibles. 


339 L est le numéro de la ligne où se trouve le curseur. 


359 NC est le nombre de coups joués. 


52 


De 370 à 449, on remplit le tableau S avec X nombres compris 
entre 1 et 6, qui représentent la combinaison à trouver. Ces nombres sont 
les couleurs des pions. 


Le jeu lui-même est constitué des lignes 5% à 1910. 


529 On déplace de 15 positions vers la droite le curseur pour le placer sur 
la première colonne de la grille de jeu. 


Les lignes 54 à 619 lisent une touche T$ et effectuent le branche- 
ment adéquat. | 


570 Si on a frappé ESC, on abandonne, on va en 117. 


589 Si on a frappé RETURN, il faut analyser la combinaison proposée, ce 
que l'on va faire en 700. 


599 Si l'on a frappé ‘flèche à gauche” ou ‘flèche à droite ”’, on va en 63Q 
pour déplacer le curseur. 


690 Si l'on a frappé R, V, J, B, M ou C, on va placer un pion en 670. 
619 Sinon, on place deux blancs pour effacer le pion et son code de cou- 
leur. 
De 639 à 650, on déplace le curseur, à condition de ne pas sortir de 


la grille. On affiche deux fois T$ en 659: ainsi le curseur se déplace de 
deux crans. 


De 679 à 689, on affiche un pion à l’endroit désigné par le curseur. 
La couleur du pion est I. 


De 7% à 99, on analyse la proposition. On compte d’abord le 
nombre N de marques noires, puis ensuite le nombre B de marques 
blanches. 


De 92ÿ à 980, on affiche la réponse de l’ORIC. Si on a X marques 
noires, la combinaison a été découverte et l’on va en 1109. 


Si vous n’avez pas trouvé la combinaison et que la grille est pleine, 
ce n’est pas très brillant et on exécute le bloc 1939-1990. 


Si vous avez trouvé, on va en 111, on affiche en double hauteur le 
t ’BRAVO”. 


Puis, si vous avez trouvé, ou si vous avez frappé ESC, les lignes 
1179 à 1229 découvrent la combinaison cachée. 


53 


1û 
zû 
30 
40 
30 
60 
7üû 
G 0 
70 
100 
110 
1 20 
1 560 
1 40 
150 
1 60 
1 70 
150 
190 
zZûüG 


ot À eur 
possibles 


LL 1 I 
CL I TT 


n + 
€ 





REM MASTER MIND x 332613263202 1X6 Xe 26 26 26 36 JE Xe 


REM INITIALISATIONS---——————--- 
P=125:R=P+1 

FOR I1=£B400+8%xP TO £6400+8*xR+7 
READ LV:POKE 1,4 

NEXT 1 

DATA 0,28,62,62,62,62,28,0 

DATA 0,0,12,30,30,12,0,0 


IN=Q : PA=2: INKIN : PAPERPA: CLS: FRINT 

INPUT'"'Nombre de pions":X:1FX<40URX>6THENI 20ELSECLI 
FORI=1TOZ22:PLOTIS8+2ZxX,I,16+PAR:NEXT 
FORI=ITO22:PLOTIS,I,16:NEXT 


FORI=24T025:PLOTIS+2#X,1,16+PA:NEXT 
FORI=24T025:PLOTIS,1,17+IN:NEXT 
PLOT 14+X,24,"Master" 

PLOT 15+X,25,"Mind" 


54 


210 
220 
230 
240 
250 
260 
270 
280 
290 
300 
310 
320 
330 
340 
350 
360 
370 
380 
390 
400 
OÙ 0 
910 
320 
930 
340 
990 
960 
9/0 
980 
590 
600 
610 
620 
630 
640 
6S0 
660 
670 
680 
690 
700 


DIM C6) :CHC1)="R": CSC 22="U" 
CH(3)="J":C#(4)="B":CSCS5)="M" 
C&Cé)="Cc" 


PLOT 3,1,"couleurs" 

PLOT 3,2,"possibles" 

FOR 1=4 TO 11:PLOTIO,I,16+PA:NEXT 
FOR I1=4 TO 11:PLOT 5,1,16:NEXT 
FOR I1=5 TO i0 

PLOT 6,1,1-4:PLOT 7,1,C$(I-4) 
NEXT 


PRINT :PRINT :L=2 


NC=1 


DIM SX) ,FCX),FSCX) 

FOR I=i TO X 

SÉI)=INT(é#RNDC1))+1 

NEXT I 

REM DEBUT DU PROGRAME-----——————— 
FOR COUP=1 TO 20 

FOR I=i TO IS:PRINT CHR#(9) : :NEXT 
PLU O9, "Notre 

PLOT 2,18 ,"proposition?" 
É=FRE(""):PLOT 6,14,STRS$ (COUP) 


GET T$:IF T$#=CHR$(27) THEN 1170 

IF T$&=CHR$( 13) THEN 700 

IF TS=CHR&CB)ORTS=CHRÉE( 7) THENS3C 
FOR I=1 TO 6:I1F T#=C$(I1) THEN 670 
NEXT:PLOTPOS(0)-1,L," ":G0TO0S/0 
IFPOS(0O) <ISANDT#=CHRS(S) THEN 570 
IFPOSC0) >14+2#XANDT#=CHRS( 9) THENS70 
PRINT T$;:T$::G0OTO0 570 


PLOTPOS(0) , L,P:PLOTPOS(O)-1,L,I 
GOTO 570 


PLOT dits u 


55 


56 


710 


aslt 


770 

1000 
1010 
102û 
1030 
1040 
1050 
1060 
1070 
1080 
1090 
1100 


PLOT 2,18,"Voyons... "IWAIT 120 
FOR 1=i TO X:F(1)=0:FS(I)=0:NEXT 
REM COMBIEN DE NOIRS ? 

N= 0 

FOR I=i TO X 


IF SCID)<>SCRN(I4+2xI,L) THEN 790 
FI)=1:FSiI)=1:NENt+I 

NEXT I 

REM COMBIEN DE BLANCS ©? 

B=0 


FOR I=1i TO X 

IF F(I1)=1 THEN 9700 

FOR J=i TO X 

IF FS(Jo=i THEN 890 

IF S(J)<>SCRNC(I4+2%xI,L) THEN 890 
FCI1)=1:FSCJi=1:B=B+1:G0OTO 900 
NEXT J 

NEXT I 

PP=19+2xX:IF N=0 THEN 950 

PLOT PP,L,0:PP=PP+1 
FORI=1ITON:PLOTPP ,L,R:PP=PP+1:NEXT 
IF B=0 THEN 980 

PLOUF PRE PP=PP#I 

FORI= {TOB: PLOTPP ,L,R: PP=PP+! sNEXT 
cn N=X THEN 1100 


PRINT :L=L+1 

NEXT COUP 

CLS:PAPER 1:INK 7 

PRINT : PRINT : PRINT : PRINT : PRINT 
PRINT SPC(13):;"VOUS ETES" 
PRINT :PRINT:PRINT CHR$(4) 
PRINT SPCCE92: 

PRINT CHR#&(27) ; "NNUL" ; CHR$#( 4) 
END 


1110 
1120 
1130 
1140 
1150 
1160 
11/70 
1180 
1190 
1200 
1210 
1220 
1230 
1240 


Note: le caractère ”£”’ est à remplacer par ”#”, 


REM TROUVE----— 
PLOT 4,17,CHR$C10)+"BRAUO !" 
PLOT Z2,18,CHR$#C10)+" BRAVO !" 
PLOT 12,17,8:PLOT 12,18,8 

PING 


PLOT 15,24,16:PLOTI8+2xX,24,16+PA 
PLOT 15,25," " 

FOR I=i TO x 

PLOT 14+2*1,24,S(1) 

PLOT 15+2*1,24,P 

NEXT I 

PRINT à0,23: 


a” est à remplacer par ” @ ”. 


1.14 BEATLES 


Ce programme n’est pas un jeu, il a simplement pour but celui de 
vous distraire avec quelques notes de musique, empruntées aux Beatles. 
Il peut aussi vous montrer comment programmer vos propres morceaux. 


Chaque mesure correspond à quatre lignes de DATA. Les doubles 
zéros que l’on a placé dans les DATA ne sont pas joués, mais sont des 
points de repère pour pouvoir jouer les reprises. 


Les ordres RESTORE permettent de se replacer au début de la 
partition, tandis que les lectures bidon” des lignes 2049, 2069 et 2099 
permettent respectivement de sauter 1, 1 et 2 mesures. 


En modifiant les ordres PLAY et WAIÏT de la ligne 2549, vous 
pourrez obtenir d’autres sonorités et tempo. 


2000 
2010 
2020 
2030 
2040 
2050 
2060 
20 70 


REM AUS TONER SANRENARRNA TE RARE 
DU=5000 : GOSUB 2510 

GOSUB 2510 

RESTORE : GOSUB 2S10 

FOR I=i TO 25:READ K,N:NEXT 
GOSUB 2510 

FOR I=i TO 24:READ K,N:NEXT 
GOSUB 2510 


07 


2510 FOR I=1 TO 3:READ K,N 


2090 FOR 1=1 TO 49:READ K,N:NEXT 
2500 REM----—————— 


2100 GOSUB 2510 
2110 WAIT 200:PLAY 0,0,0,0:END 


2080 RESTORE:GOSUB 2510 
212U 


Zr 
Œ x 
D WU 
PE 
LL »e 
eo 
EE 
LU 
LE 
+ 
© 

LC 
og 
L'on 
Z 
OS © 
Nm 
3 1 
N 


My Friends 


2540 PLAY 7,0,1,DU:WAIT 15:GOT0 2510 


2550 
3000 REM With À Little Help From 


2560 
3001 REM 
3002 


00 © “0 «0 M M “0 mt 4 


EP mem mm Ew, 


NNNNGOOOOCOON- ON 


SO ed qd A ed A ed 0 OO OO 7. +4 gd 


tm ne mn © © — OO = 
NN EN EN RE 2 En Pa 
oO M ee mn +» … NN C4 -. 
SD M COCO à en mo 
Dre nm OO OO) 4 7 7. 
NN MMMMMM ee = 7 0 M 
mm M ee em OO OO CO 7 7. 
ee 0DD00MMO0OQO0 re m1 
oO D sm mm Om vw. SO O0 m1 4 7 


r =NNOGOGODOO--- -0N 
et Ad A 04 4 eh 4 4 4 4 (0) OÙ 4 O9 4 4 
EE me MP M M mm ee 


OONNNNNNNNNNNANN A 


mm mm mm mm «+ 


M oO 0 M M M M M M M M M M M M M 


3003 DATA 
3004 DATA 
3005 DATA 
3006 DATA 
3007 DATA 
3008 DATA 
3007 DATA 
3010 DATA 
3011 DATA 
3012 DATA 
3013 DATA 
3014 DATA 
3015 DATA 
3016 DATA 
3017 DATA 
3018 DATA 


3019 


ee eme 


NNNNOCGOSOO 
M OC A4 gd 4 ed 4 ed 4 
md ne mm me 
NN NUNN ON 
MM enr me 
- =» (00 1) (9 0 “O0 © 
MO sr 
- +0 0 0 M M oO 
oo m FE ee ee 
- + © © “0 “0 M M “0 
OD ee mm m + 
ee NNNNN ON 


NN sen mm me 


» = NNO0OO000O00O 
A 4 A 4 A 04 4 et 


VONNNNN OA 


3020 DAT 
3021 DAT 
3022 DAT 
3023 DAT 
3024 DAT 
3025 DAT 
3026 DAT 
3027 DAT 
3028 DAT 


58 


em  B ee, 


em ee 


Eee mm 7 vw, 


3029 DATA 
3030 DATA 
3031 DATA 
3032 DATA 
3033 DATA 
3034 DATA 
3035 DATA 


3036 


0 0 “O0 “0 


mm 


er nm mm mm mm Om 7 ww. 


ee mm vw. 


sr ee eNNMM mn re NN M 
+ es 4 4 00 D OÙ UM) +4 4 4 + O0 0 6 M 


Fr sm mem mm mm mm vw. 


EE ne mm me m « 


” mn La m ” ” ” ” ” ”. ” ”. “ ” ” “ 


UnOnMnMmnnmMmomn 


TTL TITITITITITTITTT 
FRERE 
TTITITTITTTTTTITTLTT 
OOo OOo 
RO Oo NOW OR DE © 4 (M 
MMM TITTITTT TU LS IN 
OOo OO 0000060 
mnnnnnnmnnmnmMmnmMmnMn 


30S3 


“0 0 “O0 © 
 _ +. oo NN O 
NUE LT) 1) 4 1 1 O0 re 
Sooo NN NN ON WW Num m CN 
A ed 4 4 ee mm ee vw. ” 
nr. DOON WHO 
NN NN ON " 7 of 4 €. ©. y -. 
nes NN me NU = 
et ed 4 +4 NN + (M >. 
" 7 "7 ». — ” — 4 D) 7. et 
ruse MM OMMMn M 
QO “O0 © © TT mm © + ”. 
rer. NNANNoNNEM 1 
NN ON CO ON meme mm 7 7 +». æ. 
re. NNONNNNMES 
OO OCG0O D en: Sr ee AN CR D cm 
mms MO = + nDMG = D 
CC … NN ee 7 MM © 
PRIS ARNO OR nes 


” ”. ”. ”. ” r. 7. ”. er ee La LS ” LS ” " 


MMUMOMNNNGMNMEOM 


À 
+4 
F4 
A 
À 
ÉA 
A 
A 


058 DAT 
3062 DATA 
3063 DATA 


3 


Gé4 DATA 
3065 DATA 
aÜ0éé DATA 
3067 DATA 
3068 DATA 
30697 DATA 


3054 DAT 
3056 DAT 
3057 DAT 
3 

3059 DAT 
3060 DAT 
3061 DAT 


59 


ee em 


rem em 


ee mm + 


3070 DATA 
3071 DATA 
3072 DATA 
3073 DATA 
30 74 DATA 
3075 DATA 
3076 DATA 


3077 


oi oO © 2/02 + 


”. Lao ” Æ ” ”. æ. ee ” ” ” La ” a ” ” " ” _ L 2 ” ee En me " +. 


OO OI ou es ns mm mes OI NM MMM mm mme ee. 
Ne N'on . nCR NN ere emm me me (CC ON QI 
NOoOMMMm rer -MOoOoMMMMNOoOOCMMMm em me 
mt mnm mm em mm nm mm mm 7 M mm mt 


se eMUIN 7 7 - Ü 4 et ts 7 ee (M) 1) NN) mn 


OM ms mme mm 7 OO ne MMM mm mm mme em re 
ee MOMMNNNNO eMMMM = = eMIMNNNNN AN 
N © © es ee + Or ee NO OO nn nn nn 


CO SE SP CS 


3078 DATA 
3077 DATA 
3080 DATA 
3081 DATA 
3082 DATA 
3083 DATA 
3084 DATA 
3085 DATA 
3086 DATA 
3087 DATA 
308S DATA 
3087 DATA 
3090 DATA 
3091 DATA 
3072 DATA 
3093 DATA 
3094 DATA 
3095 DATA 
3096 DATA 
3097 DATA 
3098 DATA 
3099 DATA 
3100 DATA 
3101 DATA 
3102 DATA 
3103 DATA 
3104 DATA 
3105 DATA 
3106 DATA 


60 


1.15 PENDU 


Le but de ce jeu est de deviner un mot, que l’ORIC tire au sort. A 
chaque coup, vous proposez une lettre. Si cette lettre n’est pas contenue 
dans le mot, un membre du pendu est ajouté. Vous avez le droit à six 
erreurs. 


Tout d’abord, le programme vous demande le nom de la rubrique 
d’où il va tirer le mot à chercher. Les trois premières rubriques, MUSI- 
CIENS, SPORTIFS et HISTOIRE contiennent des noms d’hommes 
célèbres. La rubrique BOISSONS contient des noms de boissons, géné- 
ralement alcolisées. La rubrique ACTEURS contient aussi des noms de 
personnages célèbres. Enfin, STOP permet de sortir du programme. 


Si vous ajoutez des noms à une rubrique, n’oubliez pas de modifier 
en conséquence la ligne 39 ou 35. En effet, S(Q) contient le nombre de 
noms de lasæmremière rubrique, S(1) contient le nombre de noms de la 
seconde rubrique, etc. 


Voici quelques explications sur ce programme. Tout d’abord, de la 
ligne 5 à la ligne 35, quelques initialisations : 


15 L$ sera utilisé pour stocker, dans l'ordre alphabétique, les lettres déjà 
proposées par le joueur. P$ contiendra les caractères qui figurent les 
membres du pendu, D$ contient la définition du pendu, MOTS contient 
les lettres du mot découvertes et S contient le nombre de mots de 
chaque rubrique. 


29 On range dans D$ les caractères qui figureront les membres du pendu. 
39 à 35 On place dans S le nombre de mots de chaque rubrique. 


De 45 à 135, on demande au joueur la rubrique qu’il choisit, on lit 
sa réponse, et l’on se branche en fonction de sa réponse. 


De 149 à 179, l’'ORIC tire le mot que vous allez chercher. 


169 à 165 On saute tous les mots correspondants aux sujets situés avant 
le sujet choisi. 


179 On lit N mots du sujet choisi. À la sortie de cette boucle, MOTS 
contient le dernier mot lu. 


61 


189 
185 
199 


200 


229 


229 
330 


335 


355 
365 
390 
495 
419 


415 
429 


De 175 à 229, on effectue quelques initialisations. 


On remplit de blancs le tableau des lettres déjà proposées. 
On remplit de blancs le tableau des membres du pendu. 
Idem avec le tableau qui représente le mot sur l'écran. 


à 215 Dans le tableau MOTS, on place un tiret à la place de chaque 
lettre du mot à chercher. Les caractères qui ne sont pas des lettres 
(blancs, tirets, etc...) sont placés tels quels. 


On construit une chaîne d'étoiles égale à la longueur du mot à cher- 
cher plus 4. 


La boucle de jeu est formée par le bloc 225 à 425. 
à 330 On affiche le jeu. 


Si F-1, le jeu est terminé. On lit une touche quelconque et l'on se 
branche au début pour recommencer. 


à 345 On lit un caractère proposé, en vérifiant qu'il s’agit bien d'une 
lettre. 


De 350 à 425, c’est l’'ORIC qui travaille. 


On vérifie que la lettre L$ n'a pas déjà été proposée. Si c'est le cas, on 
va en 426. 


à 385 La lettre L$ est insérée dans la liste des lettres déjà proposée, 
de façon à ce que cette liste soit classée dans l'ordre alphabétique. 


à 495 Les lettres du mot égales à la lettre proposée sont placées 
dans le tableau MOT$. En sortie de cette boucle, OK vaut 1 si la lettre 
proposée était bien dans le mot. 


Si le mot a été trouvé, on positionne F à 1. 


Si la lettre proposée était bonne, on efface le message précédent s'il 
y en avait un. 


La lettre proposée n'était pas bonne, on ajoute un membre au pendu. 
Là, vous êtes très mal! 


Les mots sont stockés dans une liste DATA, en 1999 pour la 


première rubrique, en 2% pour la seconde, en 3% pour la troisième, 


CIC 


62 


# 


STE FEREFEN] 


DRE AA AAA Ne 


MEN 


* 
* 
+ 
* 
* 
* 
* 
_*# 
É. 





9 REM INITIALI SATIONS%X 2% 32% 26 66 6 À 

10 CLEAR 

15 DIM L$(25) ,P#(C6) ,D$#C6) ,MOT#(20),S(5) 
20 D$(0)="0":D#(12="1":D$(22="I1":D$S( 3)="/" 
25 D$(4)="ç":D8(5)="/": DSC 6)=" GC" 

30 S(0)=25:S(1)=25:S(2)=25:S(3)=25 

35 S(4)=25:S(5)=100 

A0 REM'CHOIX DU SUJET sense 

45 TEXT:CLS : PAPER2: INKO : PRINT :L=0:F=0 : 1=0 
50 PRINTSPC(10) ;"JEU DU PENDU" :PRINT 

99 PRINT'Les sujets sont -MUSICIENS" 


60 PRINT" SPORTIFS" 
65 PRINT" HISTOIRE" 
70 PRINT" —BOI SSONS" 
75 PRINT" CAPITALES" 
80 PRINT" —ACTEURS" 
85 PRINT" SEXE" 

70 PRINT" *STOPT 


95 PRINT :PRINT : INPUT"'UOTRE CHOIX "; CH$ 
100 IF CH$="MUSICIENS" THEN CH=0:G0OTO 145 
105 IF CH$="SPORTIFS" THEN CH=1:GOTQ 145 
110 IF CH$="HISTOIRE" THEN CH=2:GOTO0O 145 
115 IF CH$="BOISSONS" THEN CH=3:GOTO 145 
120 IF CH$="CAPITALES" THEN CH=4:GOTO 145 
125 IF CH#$="ACTEURS" THEN CH=S:GOTC 145 
127 IF CH$="SEXE" THEN 10000 

130 IF CH$="STOP' THEN PRINT'"'AU REVOIR." :END 
135 PRINT"'RATE !!!!'":GOTO0 95 

140 REM CHOIX DU MOT À TROUVER------- 

145 N=INTC(RND(1)#S(CH))+1 

150 RESTORE 

155 IF CH=0O THEN 170 

160 FOR I=i TO CH:FOR J=i TO S(I-1) 

165 READ MOT#:NEXT J,I 


63 


170 
175 
180 
185 
190 
195 


425 
1000 
1001 


FOR 1=1 TO N:READ MOT$:NEXT 

REM PREPARATION DE L’AFFICHAGE--- 

FOR 1=0 TO 25:L#(C1)=CHR$&(32) :NEXT 

FOR 1=0 TO 6:P$(1)=CHR$(32) :NEXT 

FOR 1=0 TO 20:MOT#(CI)=CHR# (32) :NEXT 
CLS: FIN=LEN(MOT$ ) 

FOR I=1 TO FIN:V$#=MIDS#S(MOTS$,1I,1) 

IF UV$=}"A"ANDUS(="Z" THEN MOT$&(I1-1)="-":GOTO 215 
MOT#(CI-1)=U$#:L=L+1 

NEXT :C$="" - 

FOR I1=1 TO LENÇ(MOT#)+4:C$=C#$+"x":NEXT 
REM AFFICHAGE DU JEU-----------—- 
PRINT CHR$<(30) ; 


PRINT 

PRINTSPC(18);"#xx2x 2x 262626 XX XXE EE 

PRINTSPC(18) ;"+x x" 

PRINT" #22 326362 E * DEJA PROPOSEES *" 

PRINT" * + #"3:SPC(16);"…#" 

PRINT" #  —-- * #  "3L86C0)3" "iL6C1)7" "sL8C225" "sLSCS) ss 
PRINT L#$(4);" ";L$S(CS)3;" ";LSCé);" 

PRINT" Où  ù +  x";SPC(16);"x" 

PRINT" #0 ù Où  % x "iL#(7);" "sLHCB);" "sLSC(9D:I" "sLSC10)5;" M 
PRINTL#(1123;" "3L#(12);" "3;LSC13);" " 

PRINT" x ù ";PSC0) ;" * #" 3; SPC(16);"%*" 

PRINT" x Ù  ";P$C3) PS1); PSC4)5;" + M: aie" MELSCIS) En 
PRINTLS(16);" "5LS(C1795;" "sLSCI18);" "sLSC19)3" "sLSC20):;" »*" 

PRINT" x ù "3P$C2);" * x"; SPCC16);"%x" 

PRINT" * ù "IPS CO2r" "sPS(6):" E a "sLSC213t" "sLS(222:" 4 
PRINTL#(C23);" "3L$(24);" ";LS(25);" x" 

PRINT"  * ù * #";SPCC16);"#" 

PRINT" x ù * CELL IÉELILLLILLLLLSI IN 

PRINT" * /ùç *" 

PRIMES Ness # “"3;CS$ 

PRINT" + *. #3 

FOR 1=1 TO FIN:PRINT MOT$#(I-1) ; :NEXT 

PRINT" *" 

PRINT"  ####X###X#%#%x%x%  ":CH:IF F=i THEN GET A$:GOTO 5 


PRINT :PRINT: PRINTCHR$#(14);"Quelle lettre proposez-vous "; 
GET L$:1FL$<"A"ORLS$S)>"2"THEN340 
PRINT L$ 
RES TRAITEMENTS ss ns 
FOR 1=0 TO 25:1F L$CI)=L$ THEN 425 
NEXT : OK=0O 
FOR I1=0 TO 25:1F L$<L$(I) THEN 380 
IF L$(I1)=" " THEN 380 
NEXT 
FOR J=25 TO 1+1 STEP-1:L$#(J)=L$(J-1):NEXT 
L$CI)=L#S:TR=I 
FOR I1=1 TO FIN:VS$=MIDS$(MOTS,1I,1) 
IF V$S=L$ THEN MOT$(I-1)=LS$:0K=1:L=L+1:GOTO 405 
TR=O 
NEXT :1F L=LEN(MOT$) THEN PRINT"'BRAVO !":F=1:GOTO 225 
IF OK THEN PRINT SPC(21) :GOTO0 225 
PSCK)=DS(K)D):K=K+1:1F K<7 THEN PRINT SPC(C21):GO0OT0O 225 
PRINT'"'Le mot etait ":;MOT#:F=1:GOTO 225 
PRINT "DEJA PROPOSEE":GOTO 225 ,. 
DATA BERLIOZ,BACH,BEETHOVEN,BIZET , BRAHMS 
DATA CHOPIN, BUXEHUDE , HUMMEL ,MOUSSORGSKY , PACHELBEL 


1002 DATA JOSQUIN DES PRES ,WAGNER ,MENDELSSOHM, SCARLATTI ,WOLLEMHAUPT 
1003 DATA CZERNY , BRAUNGARDT , RAMEAU , ROSSINI , SCHUBERT 

1004 DATA SCHUMANN ,WEBER,MOZART ,VIVALDI , OFFENBACH 

2000 DATA TABARLY ,PROST ,PLATINI ,KILLY , BORG 


64 


2001 
2002 
2003 
2004 
3000 
3001 
3002 
3003 
3004 
4000 
4001 
4002 
4003 
4004 
5000 
5001 
5002 
5003 
5004 
6000 
6001 
6002 
6003 
6004 
6005 
6006 
6007 
6008 
6009 
6010 
6011 
6012 
6013 
6014 
6015 
6016 
6017 
6018 
6019 
10000 
10005 
10010 
10015 
10020 
10025 
10030 
10035 
10040 
10045 
10050 
10055 
10060 
10065 
10070 
10075 
10080 
10085 
10090 
10095 
10100 


Note : 


DATA RUSSEL ,"CASSIUS CLAY" ,"MADAME CLAUDE" ,DARNICHE ,"NIKI LAUDA" 
DATA CAUW,PIRONI ,LAFFITE,ZITRONE ,CHICHESTER 

DATA JAZY ,MIMOUN ,ANQUETIL , BOBET ,HINAULT 

DATA MERCKX ,MOSER, POULIDOR, COPI ,RAAS 

DATA "DE GAULLE" , CHARLEMAGNE" ,VERCINGETORIX" ,ATTILA ,NAPOLEON 
DATA HITLER,WASHINGTON, CHURCHI LL , PASTEUR , FLEMMING 
DATA PETAIN,"HIRO HITO" ,"PEPIN LE BREF",CLOVIS 
DATABERTHE AU GRAND PIED,"BLANCHE DE CASTILLE" ,ROOSVELT ,KENNEDY , DESCHANEL 
DATA"LA POMPADOUR" , "MUSTAPHA KEMAL" ,POMPIDOU , REAGAN , TCHERNENKO 
DATA CONTREXEUVILLE ,ARMAGNAC ,WHI SKY ,VODKA , GIN 

DATA FRAMBOISE , GENEPI , CHARTREUSE , SAUTERNES , JUL I ENAS 
DATA" CHATEAU PETRUS" , CHAMPAGNE , COGNAC ,RIESLING , GEWURSTRAMINER 
DATA POIRE, GNOLE , SCHNAPS , PEINTURE , TRICHLORETYLENE 
DATA BRANDY ,MADERE ,PREFONTAINES , CIDRE, SAKE 

DATA PARIS, LONDRES , BONN , ROME ,MADRI D 

DATA WASHINGTON,TRIPOLI ,RYAD,"LE CAIRE" ,RABAT 

DATA TANANARIVE ,MOSCOU ,ANKARA , PEKIN, BANGKOK 

DATA TEHERAN, BAGDAD ,MONTREAL , RANGOON , TOKI O 

DATA BRASILIA,MEXICO, GEORGETOWN , CANBERRA , BAMAKO 

DATA HEPBURN, BOGART , BRANDO , GI RARDOT ,MASTROIANNI 

DATA CASSEL , DELON, SINATRA, CECCALDI , GALABRU 

DATA MEURISSE ,FERREOL ,NOIRET ,MONTANT , BURTON 

DATA DARC ,WELLS , DENEUVE , BELMONDO ,WINDMARK 

DATA PIAT ,DARRAS ,NEWMAN , SELLERS , VANNECK 

DATA LOREN ,MOREAU, FLYNN , DEPARDIEU, BRYNNER 

DATA LOLLOBRIDGIDA,CONSTANTIN,ANDRESS ,MARIELLE , KEATON 
DATA CHAPLIN,LAUREL , HARDY , JOBERT , BLANCHE 

DATA DIFILHO,BLIER,MONROE ,POIRET ,BOURVIL 

DATA FERNANDEL , LEWIS, YANNE , DAUPHIN , DEREK 

DATA DUTRONC ,MANFREDI ,WAYNE ,USTINOV , CURTIS 

DATA SERRAULT ,BALASKO ,DEUAERE , BALUTIN,TOGNAZZI 

DATA PICCOLI ,PACOME ,HUPPERT ,ASTAIRE , PRESLEY 

DATA ADAMO , HOLDEN, GABIN,BRIALY , SIGNORET 

DATA ADJANI , CARREL ,VENTURA , HANIN , SCHNEIDER 

DATA LAFONT ,GLASER,TRINTIGNANT , TAYLOR , GASSMAN 

DATA FONDA, SHARIF , SEBERG , ROCHEFORT , LANVIN 
MITCHUM,HESTON, FOSSEY ,AUCLAIR , QUINN 

DATA JOUVET , BRASSEUR ,MARAIS , MORGAN , HOFFMAN 

DATA CARMET , BARDOT ,NEVILLE ,KELLER,CHAKIRIS 

REM COMMENTAIRE POUR SEXE------ 

CLS : PRINT : PRINT 

PRINT"JE NE JOUE PAS AVEC VOUS" 

PRINT"ESPECE DE SATYRE !!!!" 

PAPER 6:EXPLODE:WAIT 200 

PRINT : PRINT 

PRINT"JE REFUSE DE JOUER AVEC" 

PRINT"UN TEL OBSEDE." 

PAPER 1 

FOR I=1 TO 10:SHOOT :WAITI0:NEXT 

PRINT : PRINT : PRINT 

PAPER 1! 

PRINT"POUR QUI ME PRENEZ-VOUS" 

PRINT"DEBILE titttiinnunuun 

FOR 1=1 TO 7 

ZAP:WAIT 10:EXPLODE:WAIT 15 

NEXT 

FOR I=1TO 20 

SHOOT :WAIT 8 

NEXT : PRINTCHRS (6) 

PLAY 7,7,4,300 


5 


le caractère ”’ü”’ est à remplacer par ” f, tandis que ”ç” est à remplacer par ” \”. 


65 


2 


Quelques 


renseignements utiles 
pour programmer vos jeux 





2.1 GESTION DE LA MÉMOIRE DE L'ORIC/ATMOS 


Lorsque l’on programme en basic, on n’a pas à se préoccuper de la 
façon dont la mémoire est gérée, utilisée. Par contre, dès que l’on intro- 
duit quelques instructions de langage machine, ou même plus simple- 
ment, dès que l’on utilise PEEK, DEEK, POKE ou DOKE, il faut 
malheureusement entrer dans ces détails sordides que sont une gestion 
mémoire. 


Tout d’abord, voici la carte mémoire de l’ORIC: 


66 


en mode HIRES 


ROM : Basic de l'ORIC 


écran 


caractères semi-graphiques 
caractères standards 


programme Basic 
(début en #51) 














de 400 à 429: rien 






adresses d'entrées/sorties 


utilisé par le Basic 


pile du 6592 


page 9 utilisée 


FFFF-65535 


CO99-49152 


BFE9-49129 


A900-40969 


9C09-39936 


98900-38912 


590-1280 


409-1924 


309-768 


209-512 


199-256 


9-9 









en mode TEXT 


programme Basic 
(début en #591) 





Les adresses sont données en hexadécimal puis en décimal. 










FFFF-65535 


C990-49152 


BFEQ-49129 


BB89-48900 


B890-47 194 


B499-46089 


9F00-497@4 


599-1289 


409-1924 


300-768 


200-512 


100-256 


Q-0 


67 


a) La page zéro. #0 à #FF 


Par construction du microprocesseur 6592, qui équipe votre ORIC, 
les octets d’adresse Ÿ à 255 peuvent être lus ou écrits plus rapidement 
que les autres. Dans un souci d’efficacité, il est conseillé de placer dans 
cette zone les quantités auxquelles le microprocesseur accède le plus 
souvent. Le Basic utilise la plupart de ces octets. Si vous écrivez un sous- 
programme en langage machine utilisé depuis un programme Basic, il est 
conseillé d'employer les octets inutilisés par le Basic. C’est le cas de la 
zone d’adresse Ÿ à 11 (40 à #B). 


b) La pile du microprocesseur. #100 à Z1FF 


A chaque fois qu’une instruction JSR, PHA ou PHP est exécutée 
par le 6592, l’adresse de retour ou l’accumulateur ou le registre d’état est 
empilé dans cette zone. Il est très fortement déconseillé d’écrire dans 
cette zone, sauf si vous aimez vivre dangereusement. 


c) Zone de travail du Basic. 4200 à #2FF 


Le Basic a besoin de mémoire pour travailler. Il utilise la page zéro, 
la zone #209 à #2FF et la zone #421 à 4FF. 


d) Les adresses d’entrées/sorties. 430 à #4#3FF 


Il n’y a pas de mémoire à ces adresses, mais tous les dispositifs 
externes à l’ensemble microprocesseur-mémoire. On y trouve entre 
autres le clavier, le magnétophone, le synthétiseur, etc... 


e) Zone de travail du Basic. #421 à #4FF 


Il est à noter que la zone #40-#420 est inutilisée. Vous pouvez 
l’employer pour y placer des sous-programmes en langage machine. 


f) La zone programme Basic. #50 à #97FF 


On y trouve d’une part le programme Basic lui-même, d’autre part 
les variables. Plus précisément, on a dans cette zone, l’organisation 
suivante : 


68 


adresses hautes «— A6-A7 HIMEM 


Chaînes 
«— A2-A3 

Zone vide 
— Aÿ-A1 

Tableaux 
«— 9E-9F 

Variables simples 

«— 9C-9D 


Programme Basic 





adresses basses «— 9A-9B, normalement 591 


— En partant des adresses basses, on trouve d’abord le 
programme Basic lui-même. L’adresse-mémoire du début du programme 
est rangée en 9A-9B, elle vaut normalement 591. En tapant PRINT 
HEXS(DEEK(#9A)) vous obtenez cette valeur. 


— Ensuite on trouve mélangées les variables entières, les variables 
réelles et les noms des variables chaînes. L’adresse-mémoire du début de 
cette zone est rangée en 9C-9D, on peut la lire en exécutant PRINT 
HEXS$S(DEEK(#9C)). 


Comme les zones programme et variables simples sont contiguës, 
on peut considérer que cette adresse est aussi celle de la fin du 
programme. | 


Chaque variable simple occupe sept octets de mémoire. Les 
variables sont placées en mémoire au fur et à mesure qu’elles sont 
rencontrées, tous types mélangés. 


* Variable réelle : nombre flottant à 5 octets 


EXP M 
LENCO. 


69 


PI et P2 sont les deux premiers caractères du nom de la variable, 
en code ASCII positif (P1<128 et P2<128). Si le nom n’a qu’une lettre, 
P2 vaut 4. 


Le troisième octet contient l’exposant plus 128, les quatre derniers 
octets constituent la mantisse, qui est comprise entre 1 et 1/2. Le nombre 
stocké vaut M.2EXP—128) 


* Variable entière: nombre à deux octets en complément à 2 


N1 et N2 sont les deux premiers caractères du nom de la variable, 
en code ASCII négatif (N1>128 et N2>128). 


* Variable chaîne: chaîne de @ à 255 caractères 


CN Le [ose [mu 0 [5 


Le premier caractère du nom de la variable est stocké en code 
ASCII positif, tandis que le second est stocké en code ASCII négatif 
(P1<128 et N22>128). Le troisième octet contient la longueur de la 
chaîne, @ si elle est vide. Puis l’on trouve, sur deux octets, l’adresse- 
mémoire de la chaîne. On a d’abord l’octet de poids faible, puis l’octet de 
poids fort de cette adresse. 


La chaîne elle-même peut se trouver soit dans la zone de stockage 
des chaînes, en haut de la mémoire, soit tout simplement à l’intérieur du 
programme Basic. 


Exemples : 
Si l’on a: 


199 A$-B$+C$ 


Lorsque cette ligne sera exécutée, la chaîne correspondant à A$ 
sera stockée en haut de la mémoire. Par contre, si l’on a: 


298 A$—’’123456789 


la chaine correspondant à A$ est la suite de caractères 123456789, elle 
existe à l’intérieur du programme, il est inutile d’aller la recopier en haut 
de la mémoire. 


— Après les variables simples, on trouve les tableaux. L’adresse 
de début de cette zone est stockée en 9E-9F. Pour la lire, exécutez 
PRINT HEXS$S(DEEK(#9E)). On peut aussi considérer que cette adresse 
est celle de la fin des variables simples, car les zones correspondant aux 
variables simples et aux tableaux sont contiguës. 


* Tableau réel 


p1 P2 Taille du tableau nb. dimensions 


Valeur max +1 du 
dernier indice 


Valeur max +1 de 


l'avant-dernier indice 














Valeur max +1 du 


premier indice 


1°" élément 
2° élément 


| ‘dernier élément 


On trouve d’abord les deux premiers caractères du nom du tableau 
PI et P2, en code ASCII positif. Ensuite on trouve sur deux octets, la 
taille du tableau, c’est-à-dire le nombre total d’octets utilisés pour stoc- 
ker le tableau. On trouve d’abord l’octet de poids faible, puis l’octet de 
poids fort de ce nombre. Sur un octet, on trouve ensuite le nombre de 
dimensions, c’est-à-dire le nombre d’indices du tableau. On trouve 








1 


ensuite pour chaque indice, en partant du dernier jusqu’au premier, la 
valeur maximale plus un de l’indice. Chacun de ces nombres est codé sur 
deux octets, l’octet de poids fort étant le premier. Les éléments du 
tableau, les réels eux-mêmes sont ensuite rangés en faisant d’abord varier 
l'indice le plus à gauche. | 


Exemple : 
DIM AB(1,2) 


définit un tableau à six éléments et deux dimensions, qui est stocke sous 
la forme : 









Tous ces nombres 
sont donnés en 
hexadécimal. 


— 4] et 42 sont les codes ASCII des lettres A et B (65 et 66 en 
base 10). 


— (927 est la taille du tableau (39 en base 10). 





— (3 est la valeur maximale plus un du deuxième indice. 


— (92 est la valeur maximale plus un du premier indice. 


72 


* Tableau entier 


La structure est analogue à celle d’un tableau réel, sauf qu’un 
élément occupe deux octets seulement contre 5 pour un réel. 
. - 


Taille du tableau 


Les deux premiers caractères du nom du 
tableau N1 et N2 sont en code ASCII négatif. 







Valeur max +1 du 
dernier indice 








Valeur max +1 de 
l'avant dernier indice Pour chaque élément, on stocke l'octet de poids 


‘ fort, puis celui de poids faible. 


Valeur max +1 du 
premier indice 
- 1" élément 


! 1 
! ' 
! ' 


dernier élément 


* Tableau chaine 






La structure est aussi analogue à celle d’un tableau réel sauf qu’un 


élément occupe trois octets seulement. 
Taille du tableau 


Le premier caractère du nom du tableau, P1;, 
est stocké en code ASCII positif, tandis que le 
second est en code ASCII négatif. 







Valeur max +1 du 
dernier indice 








Valeur max +1 de 
l'avant dernier indice 


| Valeur max +1 du 
premier indice 
1°" élément 
| 


Pour chaque chaîne on stocke sa longueur, l'octet 
de poids faible puis l'octet de poids fort de 
l'adresse de la chaîne. 





| dernier élément 
FE 


L'adresse de la fin de la zone des tableaux est stockée en AŸ-A1. En 
exécutant PRINT HEXS$S(DEEK(Æ#A)), on peut lire cette adresse en 
hexadecimal. | 


— Les chaines sont-elles stockées en partant de HIMEM, qui est 
en A6-A7, puis en descendant. A2-A3 contient l’adresse de l’autre extré- 
mité de cette zone. 


— Entre la zone des tableaux et celle des chaînes, on a une zone 
vide, inoccupée. Au fur et à mesure qu’un programme s'exécute, des 
variables, des tableaux et des chaïnes sont créés, et cette zone vide rétré- 
cit par les deux bouts. 


Si donc vous désirez utiliser de la mémoire, soit pour y placer des 
sous-programmes assembleurs ou des données structurées par vous- 
même, sans risquer de détruire le Basic ou d’être détruit par lui, vous 
avec plusieurs possibilités. 


* Utiliser la zone 499 à 424. 


* Si cela ne suffit pas on peut, avant que le programme Basic ne crée une 
chaîne, exécuter une instruction HIMEM qui abaisse le contenu de A6-- 
A7. Les octets situés au-dessus de ce plafond sont alors disponibles. 


* On peut aussi, avant que le programme n'ait créé une variable ou un 
tableau, exécuter un ordre DOKE en 9C pour augmenter l’adresse qui y 
est contenue, puis utiliser les octets situés entre la fin du programme 
Basic et cette nouvelle adresse. Ceci a un avantage: comme l’ordre 
CSAVE recopie sur cassette la zone dont l’adresse de début est en 9A- 
9B, dont l’adresse de fin est en 9C-9D, un seul ordre CSAVE permet de 
sauvegarder en même temps le programme Basic, et par exemple, des 
sous-programmes machine placés à sa suite. Mais attention, la médaille 
a un revers: Il devient impossible de modifier le programme Basic. En 
effet, lorsque vous modifiez un programme, vous lui ajoutez ou vous lui 
retirez des caractères. Aussi, l’ORIC se doit de déplacer dans la mémoire 
une partie du programme Basic, depuis l’endroit où s’est produite la 
modification, jusqu’à sa fin. Or, il se trouve que chaque ligne de 
programme Basic en mémoire contient l’adresse de la ligne suivante. 
Dans tout le bloc qui a été déplacé, l’ORIC doit recalculer ces adresses. 
Et en faisant cela, il se plante lorsque 9C-9D ne contient pas véritable- 
ment l’adresse de fin du programme Basic. 


74 


g) La zone de stockage des caracteres 


Pour chacun des deux jeux de caractères de l’ORIC, une zone de 
1 Koctet est réservée, ces deux zones sont contiguës. Deux choses sont à 
remarquer : 


— Les caractères ne sont pas situés au même endroit en mode 
TEXT et en mode HIRES, à chaque fois que vous passez d’un mode à 
l’autre, l’'ORIC les déplace. Aussi, il faut prendre garde à ceci lorsque 
l’on redéfinit un caractère : 


La définition du caractère normal de code ASCII ” A” débute à 
l'adresse 46080+8*xA en mode TEXT (ou LORES), tandis qu’elle se 
trouve en 38912+8*A en mode HIRES. 


— Chaque définition de caractère occupe 8 octets. Comme un 
code ASCII est compris entre @ et 127, on a donc à priori 
128x8—1924—1 Koctet occupé par chacun des jeux de caractères. Mais 
en réalité, il n’y a pas de caractères correspondant aux codes Ÿ à 31. Les 
32x8—256 premiers octets des deux zones sont donc inutilisés. 


h) La zone ecran 


Elle est, bien entendu, plus grande en mode HIRES qu’en mode 
TEXT. En mode texte, on a 28 lignes de 40 caractères, comme un carac- 
tère occupe un octet mémoire, l’écran en mode TEXT utilise 
28x49—1129 octets, des adresses 48999 à 49119. Il est à noter que la 
première ligne de l’écran, celle où est située le mot CAPS correspond aux 
octets d'adresses 48 à 48039, et peut-être accédée grâce à PEEK, 
DEEK, POKE et DOKE. 


En mode HIRES, on a 209 lignes de 249 points plus trois lignes de 
texte de 49 caractères. Comme chaque octet SL à six points, une 
ligne HIRES utilise 249/6—49 octets. 


L'écran HIRES utilise donc en tout (299+3)x49—8129 octets, qui 
sont situés aux adresses 49969 à 49979. 


i) La ROM #C000 à ZFFFF 


On y trouve l’interpréteur Basic, appelé aussi plus simplement le 
Basic. Il est impossible d’écrire dans cette mémoire qui, par construc- 


19 


tion, ne peut être que lue. Par construction du microprocesseur 6592, on 
trouve en FFFE, FFFEC et FFFA les adresses où il se branche en cas de 
irq (interrupt request), de reset et de nmi (non masquable interrupt) 
respectivement. Ainsi, CALL DEEK(#FFFA) produit le même effet que 
lorsque l’on enfonce la touche ”reset” et CALL DEEK(#FFFC) 
produit le même effet que lorsque l’on branche l’ORIC. 


2.2 COMMENT REDÉFINIR LES CARACTÈRES 


Chaque caractère, normal ou semi-graphique, est formé dans une 
matrice de 6 colonnes x 8 lignes. 


20 
34 
34 
62 
34 
34 





Chaque caractère est codé par 8 octets contigus en mémoire, il y a 
un octet par ligne de la matrice. Le caractère ” A” ci-dessus est code par 
les 8 octets suivants : 


32168421 













O+ 9+8+0+0+0— 8 
D+16+0+4+9+0—-209 
32+ O+9+0+2+9-34 
32+ O+9+0+2+9—-34 
32+16+8+4+2+0—62 
32+ 9+0+9+2+0—34 
32+ O+9+0+2+9—34 
+ 0+0+0+9+0= @ 









76 


c’est-à-dire qu’à chaque point du caractère correspond un ” 1”. Les 
deux bits de gauche de chaque octet sont inutilisés et valent 4. 


Les paquets de huit octets correspondant aux caractères sont 
rangés dans la mémoire en suivant l’ordre des codes ASCII des carac- 
tères. Par exemple, la zone de stockage des caractères standards débute 
en 46080 en mode TEXT. Le premier des huit octets codant la lettre 
” A”. dont le code ASCII est 65, est à l’adresse 46080+8*65—46690. On 
trouve donc: 


8 en 46690 
20 en 46691 
34 en 46692 
34 en 46693 
62 en 46694 
34 en 46695 
34 en 46606 

O en 46697 


Le premier des huit octets codant la lettre ” B”, de code ASCII 66, 
se trouve lui à l’adresse 46080+8*66—46608. 


Le programme : 


19 INPUT ”’Donner un caractère’’; CAR$ 
29 TEXT :S—46980+8xASC(CAR$) 

39 FOR I=S TO S+7 

49 PRINT I,PEEK(I) 

5ÿ NEXT I 


vous permet d’afficher les octets définissant un caractère standard. 


Le programme : 


19 S—46989+8xASC('' A’) :TEXT 
29 FOR I=S TO S+7 

39 POKE 1+8,PEEK() 

4ÿ NEXT | 


recopie la définition du caractère ” A” dans celle de ”B”. Après avoir 
exécuté ce programme, un ” À ” apparaîtra sur l’écran lorsque vous frap- 
perez la touche ”’ B”, car le caractère de code ASCII 66 a maintenant la 
forme du ” A” au lieu du ”B”. 


17 


Comme exemple, nous allons transformer le caractère @ en 7. 













20000010 


32 168421 


D+ D+0+9+2+9= 2 
32+16+8+4+0+0-60 
0+16+9+4+0+9—-209 
D+16+9+4+9+9—-29 
0+16+9+4+9+9—-209 
D+16+9+4+9+9—-20 
0+16+0+4+9+0—29 
D+ D+0+0+0+0= @ 





En exécutant le programme: 


19 TEXT :S—46989+ASC('’ @ ‘’)*x8 

28 FOR I=S TO S+7:READ V':POKE I,V :NEXT 

39 DATA 2,64,29,29,29,29,29,9 
on redéfinit @. Chaque fois que vous frapperez la touche ” @ ”, un ”r” 
est affiche. 


Le petit insecte du jeu GLOUTON est un caractère redéfini : 










20100001 


32 168 42: 


32+ 0+0+0+0+1-33 
2+16+0+9+2+9—-18 
O+ 9+8+4+9+9=-12 
O+ D+8+4+0+9=12 
O+ 9+8+4+0+9=12 
O+ 0+8+4+0+9—12 
D+16+0+9+2+9-18 
32+0+0+0+0+0+1-33 





19 TEXT :S—46989+ASC('' @ ‘’)+8 
28 FOR I=S TO S+7:READ V':POKE I,V :NEXT 
39 DATA 33,18,12,12,12,12,18,33 


redéfinit le @ en glouton. 


78 


On peut, exactement de la même façon, redéfinir les caractères 
semi-graphiques. En mode TEXT, ces caractères sont stockés à partir de 
l’adresse 47104, le premier octet d’un caractère semi-graphique de code 
ASCII a se trouve à l’adresse 47194+8xa. 


Si vous désirez redéfinir un caractère tout en étant en mode 
HIRES, il faut utiliser l’adresse 38912 au lieu de 46980 pour les carac- 
tères standards, et 39936 au lieu de 47194 pour les caractères semi- 
graphiques. En effet, l’'ORIC déplace dans sa mémoire les définitions des 
deux jeux de caractère à chaque fois que l’on passe d’un mode 
graphique à l’autre (TEXT et HIRES). 


Pour retrouver le jeu de caractères normal, vous pouvez enfoncer la 
touche reset, ou exécuter CALL DEEK(#FFFA), qui a la même action 
que reset. Vous pouvez aussi exécuter CALL #F8D qui a le seul effet 
de recharger les caractères initiaux. 


Pour terminer, voici un programme qui vous permettra de redéfinir 
n'importe quel caractère. 


10 REM REDEFINITION DES CARACTERESXxx%*+x 


30 TEXT:CLS:PAPER 2:INK O:PRINT:PRINT 
40 PRINT'"'Donnez le code ASCII ": 

DU PRINT" ÉS2=-1277 

60 INPUT CODX ; 

70 IF CODÆ<32 OR CODX)>127 THEN 4Ù 

80 PRINT'"'Quel jeu ": | 

70 PRINT"(O:normal,i:graphique) ”"; 
100 INPUT JEUX 

110 IF JEUX<O OR JEUX >1i THEN 80 

120 ÀAD=46080+1024xJEU+8*xC0D% 


140. REP MODE: D'EMPED Isere 
190 CLSIPRINIT 

160 PRINT'Dessinez le caractere ": 

170 PRINT'dans la grille" 

180 PRINT:PRINT'"Pour marquer un point:" 
190 PRINT'"-On deplace le curseur" 

200 PRINT" avec les fleches" 

210 PRINT"-On frappe X" 


79 


80 


220 


620 


PRINT 

PRINT'Pour effacer un point:" 
PRINT'"-On amene le curseur" 
PRINT" sur le point" 

PRINT"-QOn frappe la barre" 

PRINT 

PRINT'"'Lorsque le dessin est fini” 
PRINT'"frappez la touche ESC" 


REM DESSINE LA GRILLE------------ 
FOR C=ié TO 23:PLOT C,1é6,"x":NEXT 
FOR L=17 TO 24:PLOT ié,L,"x" 

PLOT 23,L,"#":NEXT 

FOR C=ié TO 23:PLOT C,25,"%":NEXT 
REM PLACE CURSEUR DANS GRILLE---- 
PRINT:PRINT:FOR I=i TO 15 

PRINT CHR#$(9) ; 

NEXT :X=1 :Y=1 

REM DESSIN DU CARACTERE---------- 
GET A$:1F AS=CHR$S(27) THEN 540 

IF A$="X"ANDX<7THEN X=X+1 : GOTOS20 
IF A$=" "ANDX(7THEN X=X+1 : GOTO520 
A=ASC(A):IF CS OR A>11 THEN 420 
IF A=8 AND X)>1 THEN X=X-1 : GOTO520 
IF A=9 AND X<é THEN X=X+1 : GOTOS20 
IF A=10AND Y<8 THEN Y=Y+1:GOTO520 
IF A=11AND Y>1 THEN Y=Y-1 :GOTO520 
GOTO 420 

PRINT 4$:;:GOTO0 420 

REM RANGE CETTE DEFINITION DANS T 
DIM T(7) : PAPER 1! 

FOR I1=0 TO 7 


FOR C=17 TO 22 


IF SCRN(C,17+I1)<>ASCC"X") THEN6éOG 
FClomT(1)+2"(22-C) 

NEXT C 

NEXT I:PAPER 2:CLS 


630 REM RANGE EN MEMOIRE ORIC-------- 
640 PRINT :PRINT 

650 FOR I1=0 TO 7 

660 POKE AD+I,T(I) 

670 PRINT"'POKE "3AD+I13:","3:TCI) 

680 NEXT I 

6790 PRINT:PRINT'"'On obtient:"; 

700 PRINT CHR$(27) ; CHR$( /2+JEU) ; 

710 PRINT CHR$&(CODZ) 

F£Ù à | 

790 REM ENCORE 7eme estime 
740 PRINT :PRINT 

750 PRINT'"'Encore (CO/N) "3::GET À$& 

760 IF A$="0" THEN RUN 

770 IF A$="N" THEN END 

780 PING:GOTO 750 


2.3 TRUCS ET FICELLES DES MODES TEXT ET LORES 


En mode TEXT ou LORES, l'écran est divisé en 28 lignes de 49 
caractères chacune. À chacun de ces 49x28—1129 caractères corres- 
pond un octet bien particulier de la mémoire de l’ORIC. Par exemple, 
le premier caractère de la première ligne correspond à l’octet 480090 
(ZBB80 en hexadécimal). Pour faire apparaître un caractère sur l’écran, 
l’'ORIC place son code ASCII dans l’octet correspondant. Vous pouvez 
faire de même avec la fonction POKE. Par exemple, pour placer la lettre 
” A”, dont le code ASCII est 65, dans le premier caractère de la pre- 
mière ligne, exécutez : 


POKE 48999,65 


Si l’on numérote les lignes de @ à 27, la ligne @ étant la ligne supé- 
rieure, et les caractères de 9 à 39, l’adresse de l’octet correspondant au 
caractère X de la ligne Y vaut 48000+40%Y +X. 


De ce qui précède, on peut déduire un premier ” truc”, qui permet 
d’écrire sur la première ligne de l’écran, celle où se trouve le mot CAPS. 


81 


19 A$='’Et voila le travail! !” 

29 GOSUB 199 

39 END 

4ÿ : 

199 REM ECRITURE A$ SUR LA 1 LIGNE 
119 FOR 1-1 TO LEN(AS) 

129 POKE 47999+1,ASC(MID$( (A$,1,1)) 

139 NEXT I 

149 RETURN 


Comme on l’a dit, à chaque position de l’écran correspond un octet 
en mémoire, pour faire apparaître un caractère à un endroit déterminé, 
on place son code ASCII dans l’octet correspondant. Or un code ASCII 
est un nombre compris entre @ et 127, qui s’exprime sur 7 bits. Comme 
un octet contient 8 bits, il reste donc a priori un bit inutilisé, le bit de 
poids fort. En fait, ce bit est utilisé lorsque l’on affiche le caractère en 
vidéo inverse. 


7: D: 5 SX TC 0 


LS code ASCII Un octet de la zone écran 


@: Le caractère est normalement affiché 
1: Le caractère est affiché en vidéo inverse 


Pour faire passer à ” 1” le bit de poids fort, il suffit d’ajouter 10000000 
(binaire) au code ASCII, ce qui vaut encore 128 en base dix ou 89 en 
hexadécimal. 


Ceci va nous permettre d’écrire en vidéo inverse, tout d’abord en 
reprenant le petit programme précédent : 


19 A$—'’'Et voila le travail”’ 

29 GOSUB 199 

39 END 

4ÿ : 

199 REM ECRITURE A$ SUR LA 1 LIGNE 
119 FOR 1-1 TO LEN(AS) 

129 POKE 47999+#1, ASC(MID$(A$,1,1))+128 
139 NEXT I 

149 RETURN 


82 


On a simplement ajouté +128 à la ligne 129. 


On peut aussi utiliser la fonction PLOT pour écrire en vidéo 
inverse, comme dans l’exemple suivant : 


19 TEXT:CLS 

29 X=-9:Y-19:A$—""Ceci est un message” 
39 GOSUB 198 

49 X=14:Y-13:A$=—''ecrit en’ 

5ÿ GOSUB 198 

69 X-12:Y-16:A$—"" video inverse’ 

79 GOSUB 19g 

De WAIT 5g:GOTO 19 

9ÿ : 

199 REM PLOT EN VIDEO INVERSE 

119 MUSIC 1,4,1,8 

129 FOR 1-1 TO LEN(A$) 

139 PLOT X+1-1,Y,ASC(MID$(A$,1,1))+128 
149 PLAY 1,9,9,25 :WAIT 15 

159 NEXT I 

169 PING :WAIT 5ÿ 

179 RETURN 


L'affichage se fait à la ligne 139. MIDS$(A$, I, 1) donne le caractère 
I de la chaine A$. ASC(MIDS(AS, I, 1)) donne le code ASCII de ce 
caractère, auquel on ajoute 128 pour obtenir un effet de vidéo inverse. 


Les codes ASCII 9 à 31 ont un rôle un peu particulier. Lorsqu’on 
les place dans un octet de la zone écran, aucun caractère n’apparaîït. En 
revanche, la ligne où ils se trouvent change d’aspect, à partir de l’endroit 
ils se trouvent. Ils permettent de choisir la couleur de l’encre, de l’écran, 
de sélectionner le jeu de caractère, la taille des caractères et de faire 
clignoter des caractères. Comme ils modifient l’aspect d’une ligne où ils 
se trouvent, on les appelle parfois ” attributs”. L’annexe 3.2 donne la 
liste de ces caractères. 


Par exemple, 18 donne à l’écran la couleur verte. Tapez POKE 
48020, 18. 


L’octet 48929 correspond au milieu de la première ligne de l’écran 
qui maintenant est verte. Si vous tapez maintenant : 


POKE 48929,17 
on obtient du rouge. Tapez: 
POKE 48929,12 et le mot CAPS se met à clignoter. 


83 


Ces codes peuvent aussi être employés avec PLOT, comme le 
montre l’exemple suivant : 


19 TEXT:PAPER Y:INK 1:CLS 
29 PLOT 11,1,CHR$(14)+'"DEMONSTRATION ” 
39 PLOT 11,2,CHR$(14)+' DEMONSTRATION 


59 PLOT 15,12,CHR$(1)+' ROUGE” 
68 PLOT 15,13,CHR$(2)+'' VERT" 
79 PLOT 15,14,CHR$(3)+''IAUNE"”’ 
88 PLOT 15,15,CHR$(4)+''BLEU 
99 PLOT 15,16,CHR$(5)+'’ MAUVE 
199 PLOT 15,17,CHR$(6)+' CYAN" 
119 PLOT 15,18,CHR$(7)+'' BLANC” 


129 : 

139 FOR 1-1 TO 7 :WAIT 299 :PING 
149 FOR ]-11 TO 19 

159 PLOT 14,],1+16 :PLOT 23,],16 
169 NEXT } 

179 NEXT I 


Le code 14 donne des lettres clignotantes double hauteur, les codes 
1 à 7 fixent la couleur de l’encre. A la ligne 159, 1+16 varie de 17 à 23 et 
fixe la couleur de l’écran. 


Pour afficher ces codes @ à 31 avec un ordre PRINT, il faut 
exécuter PRINT CHRS$(27); CHRS(code+64), voir l’annexe 3.2. 


En effet, si vous exécutez PRINT CHR$(code) et que le code est 
compris entre Ÿ et 31, l’'ORIC n’affiche pas ce code. A la place, il exécute 
un sous-programme de sa mémoire ROM. Par exemple, si vous exécutez 
PRINT CHRS(12), l'ORIC ne placera pas ce code dans la mémoire- 
écran, ne l’affichera pas, mais exécutera un sous-programme qui efface 
l’écran, en remplissant la mémoire-écran de codes 32 (blanc). L’effet de 
PRINT CHRS(code) pour les valeurs @ à 31 est décrit au début de 
l’annexe 3.1. 


Voici un petit programme démontrant quelques-unes des possibili- 
tés de ces codes avec PRINT, que l’on appelle caractères de contrôle, car 
ils permettent en majorité de contrôler le curseur. 


L PRINT CHR$(12):REM EFFACE ECRAN 
7 . 


34 PRINT @ 15,26 :’' COUCOU” 
4ÿ FOR 1-1 TO 26 


84 


5ÿ FOR 1=1 TO 26 
68 PRINT CHR$(19); :REM VERS LE BAS 
78 WAIT 28 


88 NEXT 


9ÿ : 
7 PRINT CHR$(39) ; :REM RETOUR 
119 : | 


129 FOR 1-26 TO 2 STEP —2 
134 FOR ]J=-1 TO I :PRINT CHR$(9): :NEXT 


149 FOR J=1 TO I':PRINT CHR$(19) ; :NEXT 
159 FOR J=1 TO 1-1 :PRINT CHR$(8); :NEXT 
168 FOR J=1 TO 1-1 :PRINT CHR$(11); :NEXT 
179 NEXT 


Les codes 8, 9, 19 et 11 sont les codes ASCII des touches flèches à 
gauche, à droite, en bas et en haut. On peut grâce à eux déplacer le 
curseur, à condition de ne pas oublier le ” ;” à la fin de l’ordre PRINT. 
Ce ”;” empêche PRINT d’envoyer le curseur au début de la ligne 


suivante. 


Pour terminer, voici quelques adresses qui vous assureront la 
maîtrise totale de l’écran de l’'ORIC. 


18ou #12 adresse-mémoire du premier octet de la ligne où se trouve 
19ou #13 le curseur. 
616 ou 268 numéro de la ligne où est le curseur (Q à 27. 
617 ou #269 numéro de la colonne où est le curseur (9 à 39). 
618 ou #26A bascules CTRL-D, CTRL-], CTRL-[, CTRL-F, CTRL-S et 
CTRL-Q. 
619 ou Y26B code pour PAPER (16 à 23). 
620 ou #26C code pour INK (9 à 7). 
632 ou 4278 adresse-mémoire du premier octet de la seconde ligne de 
633 ou 4279 l'écran (*BBD@ en TEXT, #BF99 en HIRES). 
634 ou #27A adresse-mémoire du premier octet de la première ligne de 
635 ou #27B l'écran (XBBA8 en TEXT, #BF68 en HIRES). 
636 ou #27C nombre de caractères à enrouler (26x4@—1%4@ en TEXT, 
637 ou #27D 2x49-80 en HIRES). 
638 ou #27E nombre de lignes de l'écran (27 en TEXT ou 3 en HIRES). 


Ces adresses sont à séparer en quatre groupes : 


— Celles qui servent au curseur: 18, 19, 616 et 617. 


Le curseur est en réalité un caractère qui est affiché normalement, 
puis en vidéo inverse, puis normalement, à nouveau en vidéo inverse, 
etc. L’adresse-mémoire du premier octet de la ligne où se trouve le 
curseur est stockée en 18-19. 


En 616 est stocké le numéro de la ligne courante, où sera affichée le 
prochain caractère. Normalement, ceci correspond à la ligne où se 
trouve le curseur. En 617 est stocké le numéro de la colonne où se trouve 


le curseur. 


Cette adresse peut servir à remplacer la fonction TAB. Tapez: 


POKE 617,19:PRINT COUCOU” 


Nous allons maintenant utiliser les adresses 18, 19 et 616 pour 
simuler une instruction PRINT X, Y, A$. Cette instruction a le même 
effet que PLOT @ X, Y; A$, mais peut écrire sur la première ligne de 
l’écran (Y—) et dans les deux premières colonnes (X=—ÿ ou 1). Considé- 
rons le programme suivant : 


10 PRINT CHR#(30) ; :INPUT'X,Y ":X,Y 
20 INPUT"CHAINE ":A4$ 


30 GOSUB 100 
40 GET ÀA$:IF A$S<)>"A" THEN 10 
30 END 


100 REM PRINT AT X,Y,A8--———— 
110 L=DEEK(18) :ACUR=L+PEEK(617) 

115 DOKE £400,£6078:CALL £400 

120 CAR=PEEK(ACUR) 

130 IF CAR)127 THEN POKE ACUR, CAR- 128 
140 L=£fBB80+Y*x40 

150 POKE é616,Y:POKE 617,X 

160 DOKE 18,L 

165 DOKE £400,£€058:CALL £400 

170 PRINT A$ 

180 RETURN 


Note: le caractère ” £”’ est à remplacer par ” #”. 


Nous allons expliquer le fonctionnement du sous-programme 190. 
Comme on l’a dit, le curseur est en fait un caractère que l’ORIC fait 
passer en vidéo inverse, en vidéo normale, en vidéo inverse, etc. Comme 
ce sous-programme va déplacer le curseur, pour le mettre à la position 


86 


X, Y, la première chose à faire est d’effacer le curseur de l’endroit où il se 
trouve, ce qui est fait par les lignes 119 à 130. 


119 On place dans ACUR l'adresse-mémoire de l'octet sur lequel se 
trouve le curseur. 


115 Nous laissons de côté cette ligne pour l'instant. 
129 On place dans CAR la valeur de l'octet sur lequel est le curseur. 


139 Si CAR est supérieur à 127, il est affiché en vidéo inverse et on le fait 
passer en vidéo normale. 


De 149 à 169, on place le curseur en X, Y. 


149 BB80 est l'adresse du début de l'écran. Comme une ligne comporte 
40 caractères, ACUR contient maintenant l'adresse du nouvel octet 
sur lequel on désire placer le curseur. 


159 On place en 616 le numéro Y de la ligne, en 617 le numéro de la 
colonne. 


169 On place en 18 la nouvelle adresse de la ligne où est le curseur. 
179 On imprime la chaîne Af$. 


Nous allons maintenant nous pencher sur les lignes 115 et 165. 
Pour faire clignoter le curseur, l'ORIC agit ainsi: A l’intérieur de 
l'ORIC se trouve une sorte de réveil-matin, appelé TIMER, qui sonne 
toutes les demi-secondes environ. À chaque fois que le réveil sonne, 
l'ORIC laisse tomber purement et simplement ce qu'il était en train de 
faire, exécuter votre programme Basic ou attendre que vous frappiez 
quelque chose, pour se précipiter en 18-19. II lit le nombre qui se trouve 
en 18-19, lui ajoute le contenu de 617, et va à cette adresse. La, il trouve 
l’octet sur lequel est le curseur. Si cet octet est supérieur à 128, il donne 
un caractère en vidéo inverse, alors l’ORIC retranche 128 à cet octet 
pour obtenir le même caractère, mais en vidéo normale. Au contraire, si 
l’octet est inferieur à 128, l'ORIC lui ajoute 128 pour obtenir l'effet de 
vidéo inverse. Ceci fait, l'ORIC retourne au travail qu'il avait aban- 
donné. Et cela recommence toutes les demi-secondes, l’'ORIC fait passer 
en vidéo inverse, puis normale, puis inverse, etc. l’octet dont l’adresse 
est stockée en 18-19 et 617. 


Maintenant, supposons que le réveil sonne pendant que l’ORIC 
exécute la ligne 149 ou 159. A la ligne 134, on avait veillé à faire passer 
le caractère sur lequel est le curseur en vidéo normale. Puis, par exemple, 


87 


vers le milieu de la ligne 149, le réveil retentit. Aussitôt, l'ORIC laisse 
tomber mon programme et va faire passer en vidéo inverse ce caractère, 
dont l’adresse est en 18-19 et 617. Puis il revient à mon programme, qui 
a la ligne 169 modifie le contenu de 18-19. Lors de la prochaine sonne- 
rie, l’'ORIC ira donc modifier l’octet dont l’adresse et la nouvelle valeur 
sont en 18-19 et 617. Ainsi, le caractère dont l’adresse était l’ancienne 
valeur stockée en 18-19 et 617 se trouve toujours, le pauvre, en vidéo 
inverse. On a donc sur l’écran un caractère qui reste en vidéo inverse, du 
plus mauvais effet. Pour parer à cela, c’est très simple, il suffit de rendre 
l'ORIC sourd à la sonnerie, ce qui est fait en 115. En effet, on place en 
44090 un #78, qui est le code d’une instruction SEI et en #491 on met 
#60, RTS. Puis on exécute ce sous-programme machine de deux instruc- 
tions. C’est l'instruction SEI qui rend sourd l’ORIC. Puis en 165, on lui 
rend l’ouïe, en exécutant le sous-programme constitué de #58 et #60, 
soit CLI et RTS. L’instruction CLI à l’effet inverse de SE. 


Si vous voulez mieux voir ce qui se passe, ajoutez la ligne: 


117 FOR 1-1 TO 4ÿQ :NEXT | 


Puis tapez: 
CLS :RUN return L’ORIC vous demande : 
X,Y? Tapez : 
19,19 return L’ORIC demande alors: 
CHAINE? Tapez : 


ABCD return 


Vous observez alors que pendant que la ligne 117 s'exécute, le 
curseur se trouve au début de la troisième ligne, et qu’il ne clignote plus. 
En effet, la ligne 115 a masqué les interruptions, a rendu sourd l’ORIC, 
qui ne va plus faire changer d’état son curseur, 

— Nous passons maintenant au second groupe, les adresses 632 à 
638 qui servent à définir la taille de l’écran pour PRINT. On trouve en 
632-633 l’adresse de la seconde ligne, qui vaut normalement #BBD en 
mode TEXT et #BF99 en mode HIRES. En 634-635 se trouve l’adresse 
de la première ligne, #BBAS8 en TEXT et #BF68 en HIRES. Le nombre 
de caractères à déplacer lorsque l’écran est plein, à enrouler, se trouve en 
636-637, et vaut 26x40—1949 en TEXT, 2x49—80 en HIRES. Enfin, en 
638 se trouve le nombre de lignes de l’écran (27 en TEXT, 5 en HIRES). 


88 


Les ordres PRINT, CLS utilisent la zone dont l’adresse de début 
vaut DEEK(634), et comportant PEEK(638) lignes de 49 caractères. 
En modifiant ces valeurs, vous pouvez modifier la partie utilisable de 
l'écran. Tapez: 


DOKE 636,7x49 :POKE 638,8 :CLS return 


Ceci restreint à huit lignes la zone utilisable de l’écran. Déplacez le 
curseur avec flèche en bas: il ne peut dépasser la 8° ligne. 


Tapez maintenant : 


DOKE 632,#BB89+49 :DOKE 634, ÆBB89 :DOKE 636,27x4ÿ : 
POKE 638,28 :CLS return 


PRINT peut maintenant écrire depuis #BB89 sur 28 lignes. C’est- 
a-dire que vous pouvez maintenant utiliser la ligne du haut de l’écran, 
celle où se trouve CAPS. Tapez et exécutez : 

19 DOKE 632, BB89+49:DOKE 634,# BB8ÿ 
28 DOKE 636,27x4ÿ :POKE 638,28 :CLS 
39 PRINT SPC(12) : "ZONE PROTEGEE” 
49 FOR 1- #BB89+4945 TO # BB89 +445 + 39 
5ÿ POKE I,ASC(’’="") 
69 NEXT I 
74 : 
88 DOKE 632, #BB80+7x+49 
9$ DOKE 634,# BB80+6+49 
199 DOKE 636,21x49 :POKE 638,22 
119 CLS 


Vous pouvez déplacer le curseur, exécuter CLS ou CTRL-L sans 
atteindre les deux lignes supérieures de l’écran. Les lignes 19-20 définis- 
sent un écran de 28 lignes, tandis que 80-119 définissent un écran de 
22 lignes. 


— Le troisième groupe d’adresses est formé de 619 et 629. On y 
trouve respectivement les attributs utilisés pour définir la couleur de 
l’écran et de l’encre lorsque CLS ou CTRL-L est exécuté. Ces deux 
commandes agissent comme suit: Pour chaque ligne, on place dans le 
premier octet la valeur qui est en 619, on place dans le second octet la 
valeur qui est en 629, et on met un code 32 (blanc) dans les 38 octets 
restants de la ligne. 


Reprenons le petit programme précédent, on ajoute les lignes 25 et 
129 pour obtenir : 


89 


19 DOKE 632,#BB89+49:DOKE 634, #BB89 
29 DOKE 636, "27 x 4ÿ : POKE 638,28: CLS 

25 POKE 619, 16 : POKE 629,7 : CLS 

39 PRINT SPC (12) : "ZONE PROTEGEE ” 

4ÿ FOR | # BB80+40x5 TO # BB89+49x+5+39 
5ÿ POKE I,ASC(’=") 

69 NEXT I 

70: 

89 DOKE 632, #BB89+7+4ÿ 

9ÿ DOKE 634, #BB80+6+49 

199 DOKE 636,21x49 :POKE 638,22 

119 CLS 

1284 POKE 619,18: POKE 629,9: CLS 


En 619, on doit placer un attribut qui détermine la couleur de 
l'écran, c’est-à-dire un nombre de 16 à 23, tandis qu’en 629 on met un 
attribut qui détermine la couleur de l’encre, un nombre compris entre Ÿ et 
7. A la ligne 29, on choisit un écran noir (16 en 619) avec de l'encre 
blanche (7 en 62). A la ligne 99, on fixe un écran vert (18 en 619) et de 
l'encre noire (9 en 620). 


— Pour terminer, le quatrième groupe qui ne comporte qu'une 
adresse 618, les 7 bits de poids faible de cet octet ont chacun une signifi- 
cation particulière, que nous donnons dans le tableau ci-dessous. 


Numéro du bit 


Poids du bit 


| Afficha 
action du Affichage | ru clavier 
bit à @ simple Al sonore 
colonnes 


Affich 
Affichage He 40. | : curseur 


affiché 


Action du 
bit à 1 


Touche faisant 
changer d'état| aucune! CTRL-D 
le bit 
Caractère de 
contrôle CHRS$(26) 
HRS$(4 
RCA aucun | CHRS$(4) CHR$(27) CHR$(19) 
d'état le bit 


90 


ubl 
double colonnes 





Lorsque l’ORIC est branché, ou lorsque l’on enfonce ” reset”, 
l’ORIC place en 618 la valeur: 


sm. [elelslsleolelils 


Ce qui vaut O+9+9+9+9+2+1=—3. Ceci correspond à: 
* Affichage simple 

* Affichage sur 38 colonnes 

* La touche précédente n’était pas ESC 

* Le clavier est sonore 

* Les caractères sont affichés 

* Le curseur est affiche. 


Les touches CTRL et les caractères de contrôle font changer d’état 
l’un de ces bits, s’il était à @, on obtient 1, et réciproquement. En 
exécutant un ordre POKE à l’adresse 618, vous pouvez initialiser tous 
ces bits aux valeurs de votre choix. Par exemple, après avoir frappé un 
nombre quelconque de touches de contrôle, POKE 618,3 vous ramène 
bien dans l’état auquel vous êtes habitué, celui de la mise en marche. 


Si vous désirez maintenant être en affichage simple, sur 49 
colonnes, avec un clavier silencieux et que le curseur né soit pas affiché, 
il faut placer en 618 la valeur: 


128 64 32 16 8 2 2 1 
Rise nier 


poids 


Affichage pas ESC | Affichage | 
simple | 
Affichage clavier curseur 
49 colonnes silencieux pas affiché 


Ce qui vaut 0+9+32+0+8+9+2+9—42. On exécute donc: 


POKE 618,42 


91 


2.4 TRUCS ET FICELLES DU MODE HIRES 


L’écran HIRES est divisé en 203 lignes de 49 caractères chacune, 
200 lignes de graphique suivies de trois lignes de texte. Exactement 
comme en mode texte, à chacun de ces 293 x49—8129 caractères corres- 
pond un octet de la mémoire de l’ORIC, de 49969 à 49979 (ZA090 à 
#BFB7). 


Si l’on numérote les lignes graphiques de @ à 199, la ligne étant la 
ligne supérieure, et les caractères de Ÿ à 39, l’adresse de l’octet corres- 
pondant au caractère X de la ligne Y vaut 49969 +40%Y +X. 


Comme en mode TEXT, une ligne est constituée de 49 octets, et le 
bit de poids fort de chacun de ses octets sélectionne le mode vidéo 
normale ou inverse. 


CR 1 Q 


Le code compris entre @ et 127 


Q: Vidéo normale 


1: Vidéo inverse 


Les 7 bits restants peuvent donner un nombre compris entre Ÿ et 
127. Comme en mode TEXT, les valeurs @ à 31 sont des attributs videos 
(voir annexe 3.2). Par contre, les valeurs 32 à 127 ne sont pas des codes 
ASCII de caractères. A la place, chacun des six bits 5 à Ÿ correspond à 
un point de l’écran. Ainsi, tout octet compris entre 32 et 127 donne six 
points. Comme on a 49 caractères par ligne, on peut donc avoir 
6x49—24@ points par ligne. Chaque bit à zéro donne un point éteint, 
tandis qu’un bit à un donne un point allumé, visible. 


Ainsi, l’octet : 


92 


128 64 32 16 8 4 2 
0 1 9 9 6 6 6 0 
Eh + #4 


Le bit à 1 a un poids de 64, il assure donc que l'octet est supérieur à 31, 
que ce n'est pas un attribut vidéo, et que les bits 5 à @ représentent donc 
chacun un point. 


1 


0+64+0+0+0+0+0+0—64 


@: On aura donc des points en vidéo normale. 


correspond-il à six points éteints. Lorsque vous :exécutez HIRES, 
lORIC place cette valeur, soit 64, dans les 29x49 octets qui consti- 
tuent la zone graphique, on a donc un écran dont tous les points sont 
éteints. Prenons un second exemple, avec l’octet : 


128 64 32 16 


8 
® 1 O0 1 0 


Assure que l'octet est supérieur à 32 


Y 
On aura six points en vidéo normale. 


Cet octet vaut 87 et donne un point éteint, un point allumé, un 
point éteint et trois points allumés. Tapez: 


HIRES return Puis : 
POKE # A999,87 return 


#A000 est l’adresse du premier octet de la zone HIRES, on voit 
donc apparaître les six points correspondant à la valeur 87 dans le coin 
supérieur gauche de l’écran. Tapez maintenant : 


FOR 1- #A099 TO # Aÿ27 :POKE 1,87 :NEXT return 


93 


Ceci place la valeur 87 dans les 49 premiers octets de la zone écran 
HIRES, qui correspondent à la première ligne de l'écran. Tapez 
maintenant : 


FOR 1-# AÏ9Ÿ TO # BF3F:POKE 1,87 :NEXT return 


Ceci remplit les 299 lignes graphiques avec ce nombre 87. 


Comme il n’est pas possible de placer dans un même octet à la fois 
une valeur inférieure à 32 et une valeur supérieure à 32, à chaque fois 
que vous placez un attribut vidéo dans la mémoire HIRES, les six points 
correspondant à cet octet seront toujours éteints, comme l'illustre 
l'exemple suivant. Tapez : 


HIRES return 
FOR I=#AFAQ TO # AFC7 :POKE 1,127 :NEXT return 


Ce qui trace une ligne au milieu de l’écran, 127 correspond à 7 bits 
a ” 1”. Nous allons maintenant placer au milieu de cette ligne l’attribut 
encre rouge” qui a pour code 1. Tapez: 


POKE # AFB4,1 return 
La fin de la ligne est bien rouge, et six points sont éteints. Tapez : 
POKE # AFB4,127 return 


Les six points sont revenus, mais la couleur rouge a disparu. 


Lorsque l’on désire remplir une zone rectangulaire de la mémoire 
écran HIRES avec un code, l’ordre FILL est très pratique. Les para- 
mêtres de cet ordre sont la hauteur du rectangle en nombre de lignes, la 
largeur du rectangle en nombre d’octets et le code à placer dans toute 
cette zone. 


FILL nombre de lignes, nombre d'octets, code. 


Avant d'employer FILL, il faut préciser à l’'ORIC les coordonnées 
du coin supérieur gauche du rectangle, par exemple avec CURSET. 


94 


Exemples : 
Tapez : 


HIRES return 
CURSET 69,59,3:FILL 199,29,127 return 


On place sur 199 lignes x 29 octets le code 127 qui correspond à six 
points allumés, on obtient donc un rectangle de 199x 129 points. Tapez : 


CURSET 54,59,3 :FILL 199,1,2 return 


On place devant chacune des lignes du rectangle un code 2, qui est 
l’attribut encre verte”. Le rectangle est donc vert. Tapez maintenant : 


CURSET 129,59,3 :FILL 199,1,4 return 


Ceci place 4, qui est l’attribut encre bleue ” au milieu du rectangle. 
Les points où sont les attributs sont éteints, tandis que les points à droite 
de ces attributs sont bleus. 


Comme le montre l’exemple précédent, l’utilisation des attributs 
vidéo ne permettent pas d’avoir sur une même ligne des points voisins de 
couleurs différentes. Cela est possible en utilisant la vidéo inverse. 
Tapez : 


HIRES return 
CURSET 69,59,3 :FILL 199,7,127 return 


On obtient un rectangle blanc que nous allons colorier en vert en 
exécutant : 


CURSET 54,59,3 :FILL 199,1,2 return 

Tapez maintenant : 

CURSET 192,59,3 :FILL 199,7,127+128 return 

127+128-255 donne six points allumés en inverse vidéo. 


Comme l'inverse vidéo du vert est le mauve, on obtient un rectangle 
mauve contigu au rectangle vert précédent. Tapez: 


CURSET 144,59,3 :FILL 199,7,127 return 


On obtient un nouveau rectangle vert contigu au rectangle mauve. 


95 


2.5 FABRIQUER DES LIGNES 
DE PROGRAMME PAR PROGRAMME 


Lorsque l’on tape de longues listes de DATA, ou de grands textes 
après des ordres PRINT, il devient rapidement fastidieux de devoir à 
chaque ligne taper un numéro, le mot DATA ou PRINT. Il est préfé- 
rable de ne taper que les données, et de laisser le soin à un programme 
d’ajouter les détails que sont le numéro de la ligne ou le mot DATA. 
Cela est possible lorsque l’on sait que: 


— Chaque ligne de programme est stockée en mémoire selon le 
format suivant : 


p. faible p. faible p. fort Q | 


adresse du début . numéro de la instructions marque de 
de la ligne suivante ligne fin de ligne 


On a d’abord sur deux octets l’adresse-mémoire de la ligne 
suivante. puis encore sur deux octets, le numéro de la ligne. Ensuite les 
caractères qui constituent les instructions, terminés par un octet nul qui 
indique la fin de la ligne. 


Les instructions sont elles-mêmes stockées de façon simple: tous 
les mots réservés, comme Z AP, FOR, PRINT, etc... sont codés par un 
octet supérieur à 128. Tous les autres caractères (noms de variables, 
constantes numériques et chaines de caractères) sont codés par leur code 
ASCII, compris entre 32 et 125. 


— Les lignes sont classées en mémoire selon l’ordre de leurs 
numéros. Il n’y a pas de place perdue, de trou entre deux lignes succes- 
sives. En #9A-#9B se trouve l’adresse du premier octet du programme, 
cette adresse vaut normalement #591. Juste après le @ terminant la 
dernière ligne du programme, on trouve deux autres octets nuls, on a 
donc en tout trois octets nuls. En #9C-#9D se trouve l’adresse de l’octet 
qui suit immédiatement ces trois octets nuls. 


96 


urnes" don ag ere ee ER 
1e ligne 2° ligne dernière ligne 
#9A-49B contient l'adresse contient l'adresse #9C-#9D 
du 1 octet du de l'octet suivant 
programme, #501 les trois octets nuls. 


normalement 


Supposons que vous désiriez trouver l’adresse de début d’une ligne 
de programme, par exemple la ligne 599. Comme l’adresse de début de 
programme est stockée en #9A-#9B et que chaque ligne débute par 
l’adresse de la ligne suivante suivie de numéro, il suffit de taper en mode 
immédiat. 

A=DEEK(# 9A):N=598 return 


REPEAT : A=DEEK(A) :UNTIL DEEK(A+2)=N return 
PRINT A return 


Les deux points qui précèdent nous suffisent par écrire un 
programme qui fabrique des lignes de DATA: 


i GOTO 1000 

10 REM CES REM FIGURENT LE 

20 REM FROGRAMME AUQUEL 

30 REM ON DESIRE AJOUTER DES 

40 REM ORDRES DATA. 

oÙ 

1000 DOKE £9C,DEEK(£9C)+5000 :CLEAR 
1010 A=DEEK(£9C)D-5000-2:N=2000 
1020 L$="";:2=FREC""): PRINT" >": 
1030 GET A$S:IF AS=CHR$S(13) THEN 1050 
1040 L$=L$+A$S: PRINT À$::GOTO 1030 
1050 IF L$="" THEN 1130 

1060 DOKE À ,A+LEN(L#)+6:DOKE À+2,N 
1070 POKE À+4,145 

1080 FOR I=i TO LEN(LS#) 


97 - 


1090 POKE A+4+I,ASC(MID#(LS,1,1)) 
1100 NEXT I 

1110 POKE A+S+LEN(LS) ,0 :A=A+LEN(LS) +6 
1120 PRINT:N=N+10:GOTO 1020 

1130 DOKE A,0:DOKE £9C,A+2:CLEAR 


Note: le caractère ” £” est à remplacer par ” #7. 


Avant d'exécuter ce programme, vérifiez soigneusement que les 
lignes 1999 à 1139 sont bien correctes. A chaque fois que le programme 
affiche ” >”, tapez une ligne suivie de RETURN. Pour sortir du 
programme, tapez RETURN immédiatement après le ?” >”. 


Exemples : 


RUN return 

> 1,2,3,4,5 return 
> 6,7,8,9,19 return 
> return 

Ready 

LIST return 


L’ORIC a ajouté les deux lignes: 


/ 


2998 DATA 1,2,3,4 
7,8,9 


Re 
2919 DATA 6,7,8,9,1 


18 

Vous pouvez changer le numéro de la première ligne, défini par 
l’instruction N—24@ de la ligne 1919. On peut changer l’incrément des 
numéros de lignes, en modifiant l’instruction N=N+19 de la ligne 1129. 
Vous pouvez aussi ajouter la ligne: 


1935 IF A$-CHR$(24) THEN PRINT’ \ ”’:GOTO 1928 


qui, en cas d’erreur, permet d’annuler la ligne en cours de frappe en utili- 
sant la touche CTRL-X. 


Le bloc 1999 à 1139 fonctionne de la façon suivante : Le nombre 
stocke en #9C-#9D est l’adresse de la fin du programme Basic mais 
aussi celle du début de la zone des variables simples. Pour que les lignes 
de DATA que le programme va ajouter à sa suite ne détruisent pas ses 
variables, on commence donc, en 19, par repousser de 5999 l’adresse 
contenue en #9C. On dispose donc maintenant de 59 octets entre la 
fin du programme et le début des variables. L’ordre CLEAR qui suit 


98 


remet à jour les adresses stockées en #9E-#9F et #AŸ-XA 1 (début et fin 
de la zone de stockage des tableaux). 


1919 On va placer dans A l'adresse de la première ligne que l'on va ajou- 
ter. On met dans N le numéro de cette première ligne. 


1929 L$ va contenir la ligne que vous allez taper. Ne pas oublier le ”:" à la 
fin de la ligne. 


1039 On lit un caractère. Si c'est RETURN, on va en 1959. 


1949 On ajoute le caractère lu à la chaîne A$ et on l'affiche. Ne pas 
oublier le ‘’:"" de l’ordre PRINT. Puis on va relire un autre caractère. 


Lorsqu'un RETURN a été rencontré, on arrive en 1959. 


1959 Si la ligne est vide, on sort du programme, on va en 113Q. 


1069 On place à l'adresse A, qui correspond au début de la ligne, 
l'adresse du début de la ligne suivante. Puis l'on place en A+2 le 
numéro de la ligne. 


1979 On place 145, qui est le code du mot réservé DATA. 


1989 à 1109 On place les codes ASCII des caractères que vous avez 
tapés. 


1119 On ajoute à la fin de la ligne un octet nul, puis l'on calcule l'adresse 
de début de la prochaine ligne. 


1129 On incrémente le numéro de la ligne, et l'on va lire une autre ligne 
en 1920. 


1139 Cette ligne est exécutée lorsque l'on sort. DOKE A,9 ajoute deux 
octets nuls à la suite de la dernière ligne, puis on met en #9C 
l'adresse de l'octet suivant. 


2.6. COMMENT ACCÉLÉRER 
UN PROGRAMME BASIC 


Dans tous les jeux d’action, il est souvent souhaitable d’accélérer 
au maximum les programmes. Voici donc quelques moyens d’accélérer 
l'exécution d’un programme Basic. Ces conseils sont valables pour la 
majorité des Basics, et donc en particulier pour celui de l'ORIC. 


99 


— Tout d’abord, et ceci est le plus important, remplacer toutes les 
constantes par des variables. 


Exemples : 
199 X=COS(9.9174532925x%T) 
peut être remplacé par: 


19 CDR-O.9174532925 


ss... 


198 X-COS(CDR:+T) 


Il est en effet beaucoup plus rapide de rechercher en mémoire la 
valeur d’une variable que de convertir une chaine de chiffres en un réel. 


— A chaque fois que l’on utilise une variable, celle-ci est cherchée 
en mémoire en partant de l’adresse stockée en #9C-#9D. Pour diminuer 
ce temps de recherche, on peut: 


* diminuer le nombre total des variables, en reutilisant au maxi- 
mum les mêmes noms. Par exemple, utiliser autant que possible la même 
variable pour toutes les boucles FOR … NEXT. 


* placer au début de la zone des variables celles qui sont utilisées le 
plus fréquemment, par exemple celles qui sont utilisées à l’intérieur des 
boucles. Pour cela, utiliser une fois ces variables au début du 
programme. Si vous ajoutez par exemple la ligne: 


1 1=9:J-1:K=-l:L=1I 


La variable I sera la première dans la zone des variables simples et 
sera donc retrouvée instantanément à chaque fois que l’on voudra l’utili- 
ser. On trouvera ensuite la variable J, puis K, puis L. 


— Se méfier des GOTO et GOSUB. En effet, cela prend du temps 
de retrouver un numéro de ligne dans un programme. Si un sous- 
programme est utilisé fréquemment, on a intérêt à le placer au début du 
programme. 


100 


1 GOTO 1999 REM VERS PROGRAMME 
19 REM S-PROGRAMME 


ss... 


........ 


ss... 


Dans la mesure du possible, remplacer les GOTO par des boucles 
FOR … NEXT ou REPEAT … UNTIL. 


— Lorsque cela est possible, simplifiez ou supprimez les tests. 


Exemples : 
39 IF V<> Ÿ THEN 199 


peut être remplacé par: 


39 IF V THEN 199 


19 IF A$-CHR$(8) THEN X=X-1 
29 IF A$-CHRS$(9) THEN X=X+1 


peut être remplacé par la seule ligne: 
19 X-X+(A$-CHRS$(8))-(A$—-CHR$(9)) 


En effet, (A$—CHRS$(8)) est une expression logique qui vaut —1 si 
elle est vraie, Ÿ sinon. De même (A$—CHRS$(9)) vaut —1 si elle est vraie 
et Ÿ sinon. 


— Diminuez le nombre de lignes en mettant plusieurs instructions 
par ligne. Pour pouvoir mettre plus d’instructions par ligne, supprimez 
tous les blancs, ne conservez que les deux premiers caractères des noms 
de variables. 


— Utilisez les variables entières. Évitez les tableaux. 
— Supprimez les REM. 


— Enfin, réécrivez en assembleur les parties critiques du jeu. C’est 
difficile, mais cela donne des résultats bien plus spectaculaires que tout 
ce qui précède. 


101 


2.7 UN PETIT EXEMPLE DE 
SOUS-PROGRAMME ASSEMBLEUR 


Ce programme ne fait pas grand-chose, excepté montrer comment 
ajouter un sous-programme assembleur simple à un programme Basic. 
On trace un petit dessin au bas de l’écran HIRES, et on le déplace 
ensuite vers le haut de l’écran à l’aide du sous-programme assembleur. 


On trouve un programme principal, de 19 à 149, puis en 1990 un 
sous-programme qui trace un petit dessin, puis en 244 un sous- 
programme qui sert à amener en mémoire les instructions 6592. Nous 
allons d’abord regarder ces instructions machine. 


Le sous-programme 6592 déplace d’une ligne vers le haut une 
partie rectangulaire de l’écran HIRES. Comme chaque ligne est consti- 
tuée de 49 octets, il suffit de déplacer de 49 les octets qui correspondent 
au rectangle. 


En entrée du sous-programme, on a: 


— en 1-2, l’adresse-mémoire de l’octet qui correspond au coin 
supérieur gauche du rectangle à déplacer. 


— en 3, le nombre de lignes du rectangle. 
— en 4, le nombre d’octets de chacune des lignes du rectangle. 


En sortie du sous-programme, on a déplacé vers le haut d’une ligne 
le rectangle et : 


— en 1-2, l’adresse-mémoire qui correspond au coin supérieur 
gauche du rectangle qui a été déplacé. C'est-à-dire l’adresse que l’on 
avait en entrée moins 4ÿ. 


— en 3, ce nombre n’a pas été modifié. 
— en 4, ce nombre n’a pas été modifié. 
— 5 et 6 sont modifiés. 


Ce sous-programme DHAUT appelle lui-même deux sous- 
programmes NXLIG et PLIG qui ajoutent et retranchent respectivement 
4ÿ à l’adresse contenue en 1-2. Ce nombre 49 est celui des octets consti- 
tuant une ligne écran, ils permettent donc de passer respectivement à la 
ligne suivante (NXLIG) et à la ligne précédente (PLIG). 


102 


A6 93 
29 XX 
A5 ÿ1 
48 

A5 2 
48 

A4 ÿ4 
A5 fÿ1 
85 95 
A5 #2 
85 96 
28 XX 
B1 1 
91 95 
88 

19 F9 
CA 

19 E9 
68 

85 42 
68 

85 91 
68 

A5 1 
18 
69-20 
85 #1 
99 92 
E6 92 
6ÿ 

A5 1 
38 

E9 28 
85 91 
Bÿ 92 
C6 92 
69 


XX 


XX 


DHAUT 


TLIGNE 


TRCARA 


NXTLIG 


RTS 1 


PLIG 


RTS 2 


LDA 
CLC 
ADC 
STA 
BCC 
INC 
RTS 


LDA 
EC 
SBC 
STA 
BCS 
DEC 
RTS 


PLIG 


ND 


XLIG 
), YŸ 
LE 


Gr ZONES 


TRCARA 
TLIGNE 
2 


1 


# 4ÿ 


RTS 1 


# 4ÿ 


RTS 2 


Init. compteur de lignes. 

Oter 49 à (1-2). 

Sauvegarder 1 

dans la pile. 

Sauvegarder 2 

dans la pile. 

Init. compteur d'octets par ligne. 
Recopier 1 

en 5, puis 

recopier 2en 

6. 

Ajouter 4 à (1-2). 

Prendre un octet et 

le recopier, 49 octets avant. | 
Décrémenter compteur d’octets. 
Si compteur positif, continuer ligne 
Sinon, décrémenter compteur lignes 
Si compteur positif, continuer. 
Terminé. Récupérer 

2et 

récupérer 

1 puis 

retour au programme Basic. 


Prendre octet de poid faible en 1 
préparer une addition 

ajouter 4ÿ et 

ranger le résultat. 

Si pas de retenue, retour 

Sinon, propager la retenue 

Fin. 


Prendre octet de poids faible en 1 
préparer une soustraction 
retrancher 4ÿ et 

ranger le résultat. 

Si il y a retenue, retour 

Sinon, décrémenter poids fort 
Fin. 


Ce sous-programme est mis en mémoire par les lignes 2900 à 2070. 


2910 A est l'adresse-mémoire où l'on va placer les codes. #9C00 corres- 
pond au début de la zone de stockage des caractères semi- 
graphiques en mode HIRES. Comme le programme n'utilise pas les 


103 


2029 


2059 


2060 


caractères semi-graphiques, on n'hésite pas à les écraser, car on a 
entre #9C00 et #ADOO, 1 Koctet de mémoire dans lequel le Basic 
ne va pas écrire, tant que l'on ne frappe pas reset. 


à 2040 Les 65 octets sont placés en mémoire à partir de l'adresse 
A. 


Le sous-programme DHAUT est le premier, son adresse DH est 
égale à A. Comme DHAUT fait 41 octets, le second sous- 
programme NXTLIG débute à l'adresse NX=DH+41. Et comme 
NXTLIG fait 12 octets, le troisième, PLIG, débute donc à l'adresse 
PL=NX+ 12. 


Après avoir calculé les adresses DH, NX et PL des sous- 
programmes, on peut ajouter au sous-programme les adresses de 
PLIG et NXTLIG, en DH+3 et DH+22 respectivement. 


Pour utiliser DHAUT, on commence par placer en (1-2) l’adresse 
de l’octet qui correspond au coin supérieur gauche du rectangle à dépla- 
cer, ce qui est fait en 69. En 79, on place en 3 le nombre de lignes du 
rectangle, 41, et on place en 4 le nombre d’octets par ligne de ce 
rectangle, soit 9. Le sous-programme est appelé à la ligne 119 par CALL 
DH. Cet ordre est situé dans une boucle, le sous-programme est appelé 
159 fois de suite, on déplace donc de 159 lignes vers le haut le dessin. 





104 


Pour finir, voici le listing du programme: 


10 KRKEM FACE DE LUNEXKXKXKXKXXXKXKXXXXXXXXXXX 
20 MIRES 

30 GOSUR 2000 

40 : 

30 X=50+15O0XARND (1): Y=170 

60 DOKHE 1, HAO0OO0+4(V-20) X40+X/6-5 

70 POKE:Ssañ4l2PORE 4,7 

GO MUSIL. Fe Li LSUSPERATY ss, 100 

90 GOSUR 1000 

100 FOR Izi TQ 150 

TO CELL DAS SOUND: LOU IsE0 

120 NEXT 

1:50 HIRES: GOTO 50 

140 : 

LOUE HE DES S LM ne en ne EE NS ARE En ee 
LUI0 CÜRSET XsYiS 

1020 FOR Kai TQ SO: CIRÇCLE K,1:NEXT 
1050 FOR 1=-1 TO 1 STEF 2 

19040 CURSET X+IKk9,Y-10,0 

1050 FOR J=i TO S:CIRCLE J.OsNEXT J 
10640 CURSET X+IK7.Y—10,1 

1070 FOK J=0 T0 6 

10890 CURSET. X+IKU, Y-JS/oriI0s0 

1090 CURSET X+I1KJ:Y-J"2/6+11,0 

1100 NEXT J 

11160 NEXT I 

LIPOEURSET. XP rre02 

1150 FILL. 40, 1, L+/XANDEE ) 

1140 RETURN 

2000 REM SOUS-PROGRAMMES 650 hu oste 
2010 =K#9CQ00 

2020 FOK Is TO +64 

2050 KREAD ViFOKRE I, V 

“040 NEXT IT 

2080 DHzA:s NX=DH+41: FLENX +1 

2060 DOKE DH+S.PLSIDOKE DH+22, NX 

2070 RETURN 

2 1)E30 

2OPO: MEME DAT sims Rss esse Net es 


105 


106 


2100 
2110 
120 
2150 
2140 
190 
2160 
+0 
2160 
Te 
200 
2210 
DU 


des bros deu 


7 
D e.10 


DATAHAG, HOS, HEO, HFF, RFF, HAS, #01 
DATAHAG, HAT, HO, #46, HA, HO4, HAS 
DATAHOL, #55, HO, HAS, HOT, HAS, HOË 
DATAHEO,HFFHFF SHELL, HO, #91, HOS 
DATAHBS,HIO,HF9, HCA, #10, HE9, #68 
DATAHGS,HOË, #66, #95, #01, #60 


REM NXTLIG..... a 
DATAHAS, HO1, #18, #69, 478,405, #01 
DATAHPO, HOD,HED, HO, H6O 


REM FLIG....... da de nt Le 
DATAHAS, HO1L, HIS, HE, #28, #05, #01 
DATAHEO, HO, HC6, #OË, #60 








Annexes 





Effet de la touche ou 
de PRINT CHRS${code) 








CTRL-A relit un caractère 
sur l'écran. 


Aucun 


CTRL-C interrompt un 
programme basic. 


Provoque un affichage 
double. Les caractères 
suivants seront affichés 
deux fois chacun. Pour 
annuler, utiliser de nou- 
veau CHRS$(4) ou CTRL-D 


Aucun 








3.1 TABLE ASCII DE L'ORIC/ATMOS 


Effet de PLOT X,Y,code 









Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X sont noirs. 


Tous les caractères affichés 
sur la ligne ŸY et situés après 
la colonne X sont rouges. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X sont verts. 


Tous les caractères affichés 
sur la ligne ŸY et situés après 
la colonne X sont jaunes. 


Tous les caractères affichés 
sur la ligne Ÿ et situés après 
la colonne X sont bleus. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X sont violets. 


107 


Code 
ASCII 


11 


Le 


108 


Touche 


CTRL-F 


CTRL-G 


CTRL-H ou + 


CTRL-I ou — 


CTRL-J ou Ÿ 


CTRL-K ou Î 


CTRL-L 


Effet de la touche ou 
de PRINT CHR${code) 


Supprime le ‘’plop” que 
l'on entend lorsque l'on 
frappe une touche. Pour 
retrouver le bruit, réutili- 
ser CHR$(6) ou CTRL-F. 


Fait retentir PING. 


Déplace le curseur un 
cran à gauche. 


Déplace le curseur un 
cran à droite. 


Déplace le curseur un 
cran vers le bas. 


Déplace le curseur un 
cran vers le haut. 


Efface l'écran. 


Effet de PLOT X,Y,code 





Tous les caractères affichés 
sur la ligne ŸY et situés après 
la colonne X sont bleus ciels 
(cyan). 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X sont blancs. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en hauteur simple, 

— en affichage fixe, 

— jeu de caractères . 
standard. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne ŸY seront : 

— en hauteur simple, 

— en affichage fixe, 

— jeu de caractères semi- 
graphique. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en double hauteur, 

— en affichage fixe, 

— jeu de caractères 
standard. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en double hauteur, 

— en affichage fixe, 

— jeu de caractères semi- 
graphique. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en simple hauteur, 

— en affichage clignotant, 
— jeu de caractères 
standard. 


Code 
ASCII 


13 


14 


29 


21 


Touche 


CTRL-M ou 
RETURN 


CTRL-N 


CTRL-O 


CTRL-P 


CTRL-Q 


CTRL-R 


CTRL-S 


CTRL-T 


CTRL-U 


Effet de la touche ou 
de PRINT CHR${code) 


Envoie le curseur au 
début de la ligne suivante. 


Efface la ligne ou se 
trouve le curseur. 


Aucun. 


Aucun. 


Supprime le curseur. Pour 
le retrouver, réutiliser 
CHR$(17) ou CTRL-Q. 


Aucun. 


Supprime l'affichage. 
Pour le rétablir, réutiliser 
CHR$(17) ou CTRL-S. 


Passage en minuscules. 
Pour obtenir une majus- 
cule, utilisez SHIFT. Pour 
revenir en majuscules, 
réutilisez CHR$(20) ou 
CTRL-T. 


Aucun. 


Effet de PLOT X,Y,code 





Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en simple hauteur, 

— en affichage clignotant, 
— jeu de caractères semi- 
graphique. 


Tous les caractères affichés 
sur la ligne Ÿ et situés après 
la colonne X seront: 

— en double hauteur, 

— en affichage clignotant, 
= jeu de caractères 
standard. 


Tous les caractères affichés 
sur la ligne Y et situés après 
la colonne X seront: 

— en double hauteur, 

— en affichage clignotant, 
— jeu de caractère semi- 
graphique. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera noir. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera rouge. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera vert. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera jaune. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera bleu. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera violet. 


109 


Code 
ASCII 


22 


23 


24 


25 


26 


27 


28 


29 


110 


Touche 


CTRL-V 


CTRL-W 


CTRL-X 


CTRL-Y 


CTRL-Z 


CTRL-[ ou ESC 


CTRL-/ 


CTRL-| 


Effet de /a touche ou 


de PRINT CHRS${code) 


Aucun. 
Aucun. 


CTRL-X annule la ligne en 
train d'être frappée. 


Aucun. 


A la même action que 
ESC. Voir ci-dessous. 


Ce caractère n'est pas 

affiché, et ne déplace pas 
le curseur. Par contre, le 
caractère suivant sera af- 
fiché après que ses bits b, 
et b, aient été mis à zéro. 


Aucun. 


Normalement, lorsque 
l'on frappe sur une touche 
ou que l'on exécute 
PRINT, aucun caractère 
n'est affiché dans les deux 
premières colonnes de 
l'écran. Le caractère per- 
met d'utiliser ces colon- 
nes. Mais alors les textes 
sont blancs sur fond noir, 
car les caractères com- 
mandant la couleur de 
l'écran et du texte, qui se 
trouvent normalement 
dans ces deux colonnes, 
sont écrasés. Réutilisez 
CHR$(29) ou CTRL-| 
pour revenir comme 
avant. 


Effet de PLOT X,Y,code 





Le fond (PAPER) de la ligne 
Y, à partir de la colonne X, 
sera cyan. 


Le fond (PAPER) de la ligne 
Y, à partir de la colonne Ÿ, 
sera blanc. 


Passage en texte 60 Hz. Ne 
pas utiliser, perturbe l'affi- 
chage. 


Passage en texte 60 Hz. Ne 
pas utiliser. 


Passage en texte 50 Hz, 
rend l'affichage normal. 


Passage en texte 50 Hz, 
rend l'affichage normal. 


Passage en graphique 60 Hz. 
Ne pas utiliser, perturbe 
l'affichage. 


Passage en graphique 60 Hz. 
Ne pas utiliser, perturber 
l'affichage. 


Code 
ASCII 


39 


32 
33 
34 
35 
36 
37 
38 
39 
49 
41 
42 
43 
44 
45 
46 
47 
48 
49 
59 
51 
52 
53 
54 
55 
56 


Touche 


Pas de touche 


CTRL-DEL 


barre d'espacement 


— 


DO M OO où BR À NN 


200002 00900222 ee 


Effet de la touche ou 
de PRINT CHRS{code) 


CHR$(30) renvoie le 
curseur dans le coin supé- 
rieur gauche de l'écran, 
qui n'est pas effacé. 


Affiche un ! 
Affiche un ” 
Affiche un # 
Affiche un $ 
Affiche un % 
Affiche un & 
Affiche un” 
Affiche un { 
Affiche un) 
Affiche un * 


Affiche un + 


Affiche un, 


Affiche un — 
Affiche un. 

Affiche un / 
Affiche un @ 
Affiche un 1 
Affiche un 2 
Affiche un 3 
Affiche un 4 
Affiche un 5 
Affiche un 6 
Affiche un 7 
Affiche un 8 


| Affichage normal. 


Affiche un espace, un blanc 











Effet de PLOT X,Y,code 


Passage en graphique 50 Hz. 
Affichage normal. 


Passage en graphique 50 Hz 


(guillemet) 
(dièse) 
(dollar) 


(apostrophe) 


(signe de multiplication) 


(signe de division, slash) 


Code 
ASCII 


57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 


à 


Touche 


IO nm on ww > ® + V 


ee EC SO DÉCO = SF AE 


Affiche un 9 

Affiche un : 

Affiche un ; 

Affiche un < 
Affiche un = 
Affiche un > 
Affiche un ? 

Affiche un @ 
Affiche un A 
Affiche un B 
Affiche un C 
Affiche un D 
Affiche un E 

Affiche un F 
Affiche un G 
Affiche un H 
Affiche un | 

Affiche un J 

Affiche un K 
Affiche un L 

Affiche un M 
Affiche un N 
Affiche un O 
Affiche un P 
Affiche un Q 
Affiche un R 
Affiche un S 
Affiche un T 

Affiche un U 
Affiche un V 
Affiche un W 


Effet 


(colon) 


(semi-colon) 


Code 


ASCII 


88 
89 
99 
91 
92 
93 
94 
95 
96 
97 
98 
99 

100 

191 

192 

193 

194 

195 

196 

107 

198 

199 

| 119 


112 
113 
114 
115 
116 
re? 


Touche 


N << x 


a — 


> — 


£ 


pas de touche 


— © On MO © 0: ?»P 


C 10 7 Pp vVv OZzZ< rt 


Affiche un X 
Affiche un Y 
Affiche un Z 
Affiche un fl 
Affiche un \ 
Affiche un | 
Affiche un 
Affiche un £ 


Affiche un (©) 


Affiche un a 
Affiche un b 
Affiche un c 
Affiche un d 
Affiche un e 
Affiche un f 
Affiche un g 
Affiche un h 
Affiche uni 
Affiche un j 
Affiche un k 
Affiche un 
Affiche un m 
Affiche un n 
Affiche un o 
Affiche un p 
Affiche un q 
Affiche unr 
Affiche un s 
Affiche unt 
Affiche un u 


Effet 


(crochet ouvrant) 
(backslash) 
(crochet fermant) 


t 


(livre) 


Pour obtenir les 
minuscules au clavier, 


frapper d'abord 
CTRL-T 


113 


Code 


ASCII Touche Effet 
118 V Affiche un v 

119 W Affiche un w 

129 X Affiche un x 

121 Y Affiche un y 

122 Z Affiche un z 

123 { Affiche un 

124 | Affiche un | 

125 Affiche un 

126 pas de touche Affiche un carré clair 
127 DEL DEL annule un caractère 


CHR$(127) affiche un carré sombre. 





Les codes 128 à 255 provoquent les mêmes effets 
que les codes de @ à 127. Avec deux petites diffé- 
rences : 


— les codes 128 à 159 sont affichés, alors que les 
codes @ à 31 ne le sont pas. CHR$(128) a le 
effet que ESC , CHR$(129) a le même effet que 
ESCA, …, etc. 


— les caractères correspondant aux codes de 128 à 
255 sont affichés en vidéo inverse, lorsqu'on les 
utilise avec PLOT. 





3.2 TABLE DES ATTRIBUTS VIDÉO 


Les codes ASCII 9 à 31 ont une action spéciale lorsqu'on les place 


dans la zone mémoire correspondant à l’écran TEXT ou HIRES. 


Ils permettent de choisir la couleur de l’encre, du fond, le jeu de 


caractère, normal ou semi-graphique, la taille des caractères et le 
clignotement. 


114 


Pour placer un code dans la mémoire-écran, vous pouvez: 


— Exécuter POKE adresse, code 


— Exécuter PLOT X,Y,CHRS$(code) ou PLOT X,Y,.code 
— Exécuter PRINT CHR$(27); CHR$(code +64) 


— Frapper la touche ESC puis la touche dont le code ASCII vaut 
code +64. 


Par exemple, pour code—ÿ, code+64 vaut 64 et CHRS$(code+64) 
vaut ” @ ”. Pour code=l, code+64 vaut 65 et CHR$(code+64) vaut 
PR 


Chacun de ces codes est actif depuis l’endroit où il se trouve 
jusqu’à la fin de sa ligne. 


Attributs de @ à 15 






Avec POKE 
ou PLOT 
code 


Avec PRINT Depuis le clavier Action 


sur le système vidéo 


PRINT CHR$(27);"@" ESC @ encre noire 





PRINT CHRS$(27);"A" ESC A encre rouge 

PRINT CHRS$(27);"B" ESCB  |encre verte 

PRINT CHRS$(27);"C" ESC C encre jaune 

PRINT CHR$(27);"D" ESC D encre bleue 

PRINT CHR$(27);"E" ESC E encre magenta 

PRINT CHRS$(27);"F" ESC F encre cyan 

PRINT CHR$(27);"G” ESC G encre blanche 

PRINT CHRS$(27);"H" ESCH [simple hauteur, fixe, 
normal 

PRINT CHRS$(27);"1" ESC: simple hauteur, fixe, 


semi-graphique 


115 


19 PRINT CHRS$(27);"J" double hauteur, fixe, 
normal 

11 PRINT CHRS$(27);"K" double hauteur, fixe, 
semi-graphique 

12 PRINT CHRS(27);"L" simple hauteur, clignotant, 
normal 

19 PRINT CHR$(27);"M" simple hauteur, clignotant, 
semi-graphique 

14 PRINT CHR$(27);"N" double hauteur, clignotant, 
normal 

15 PRINT CHR$(27);"0" double hauteur, clignotant, 


semi-graphique 





Les codes de Ÿ à 7 permettent de fixer la couleur de l’encre, tandis 
que les codes 8 à 15 sélectionnent le type de caractère employé, un 
caractère peut en effet être: 


— normal ou semi-graphique 


— simple hauteur ou double hauteur 


— fixe ou clignotant 


Attributs de 16 à 31 















Avec POKE 
ou PLOT 
code 





Action 
sur le système vidéo 





Avec PRINT Depuis le clavier 






























PRINT CHRS$(27);"P" ESCP écran noir 
PRINT CHRS(27);"Q" ESC Q écran rouge 
PRINT CHRS$(27);"R" ESCR écran vert 





116 


19 PRINT CHR$(27);"S" ESCS écran jaune 


20 PRINT CHRS$(27):"T" ESC? écran bleu 
21 PRINT CHRS$(27):'"U" ESC U écran magenta 
22 PRINT CHRS(27):"V" ESC V écran cyan 
23 PRINT CHRS$(27):'"W" ESC W écran blanc 
24 PRINT CHRS$(27):"X" ESC X mode texte 
en 60 Hz 
25 PRINT CHRS$(27):"Y" ESC Y mode texte 
[en 60 Hz 
26 PRINT CHRS$(27):"2Z" ESC Z mode texte 
en 50 Hz 
27 PRINT CHRS$(27):" { ” ESC | mode texte 
en 50 Hz 
28 PRINT CHR$(27);" |” ESC | mode graphique 
en 60 Hz 
29 PRINT CHRS$(27):" | " ESC | mode graphique 
en 60 Hz 
30 PRINT CHRS$(27); pas de touche | mode graphique 
CHRS$(30) en 50 Hz 


31 PRINT CHR$(27): ESC DEL mode graphique 
CHR$(31) en 50 Hz 





Les codes de 16 à 23 permettent de fixer la couleur de l’encre, 
tandis que les codes 24 à 31 commandent le mode vidéo. On peut: 


— être en mode texte (TEXT et LORES) ou en mode graphique 
(HIRES) 


— balayer l’écran 50 fois ou 60 fois par seconde. En France, le 
balayage se fait en 50 Hz. 


117 


3.3 LE MICROPROCESSEUR 65202 


Le microprocesseur 6592, qui équipe votre ORIC, est capable de 


manipuler, 


de traiter des données de 8 bits (octets), et engendre des 


adresses de 16 bits. Il dispose de 7 registres : 


* 


X et Ÿ : 


118 


accumulateur À 


index X 


index YŸ 


compteur ordinal PC 


r- 


pointeur de pile S 


NIVIBIDI1IZIC] étatP 


: Ce registre de 8 bits contient le résultat de toutes les opéra- 


tions, logiques ou arithmétiques. 


Ces deux registres de 8 bits peuvent servir de compteur ou 
servent à construire une adresse. 


: Ce registre de 16 bits contient l’adresse de la prochaine ins- 


truction à exécuter. 


: Ce registre de 8 bits contient l’octet de poids faible du poin- 


teur de pile. L’octet de poids fort vaut 1, car par construction 
du 6592, la pile est située entre 199 et 1FF (adresses hexa- 
décimales). 


: Ce registre de 7 bits contient 7 indicateurs. 


N Indicateur de résultat négatif. 
V Indicateur de débordement (Overflow). 
B Indicateur de BREAK. 


D Indicateur de mode de calcul décimal. 


I Indicateur d’interruptions masquées. 
L Indicateur de résultat nul (Zéro). 
e Retenue (Carry). 


Le 6502 dispose de 13 modes d’adressage qui sont : 


ADC 


AND 


ASL 


BCC 


Immédiat 

Page zéro 

Page zéro indexé par X 
Absolu 

Absolu indexé par X 
Absolu indexé par Y 
Indirect pré-indexé par X 
Indirect post-indexé par Y 
Accumulateur 

Implicite 

Relatif 

Indirect 

Page zéro indexé par Ÿ 


ex : LDA #FF 


LDA 1 

LDA 1,X 

LDA 1909 
LDA 1999,X 
LDA 1900,Y 
LDA (1999,X) 
LDA (19909),Y 
ROL 

TAX 

BNE 1909 
JMP (19900) 
LDX 1,Y 


Le 6592 dispose de 56 instructions qui sont : 


L'opérande est ajouté au bit C de retenue et à l'accumulateur, le 


résultat est dans l'accumulateur. 


On effectue le ET logique bit à bit de l'’accumulateur et de l'opé- 
rande, le résultat est dans l'accumulateur. 


L'opérande est décalé d'un bit vers la gauche. 


7 


g 


Branchement relatif lorsque C — @ (pas de retenue). 


119 


BCS 
BEQ 
BIT 


BMI 
BNE 
CRE 
BRK 
BVC 
BVS 
CLC 
CLD 
CLI 
CLV 
CMP 


CPX 
CPY 
DEC 
DEX 
DEY 
EOR 


INC 
INX 
INY 
JMP 
JSR 
LDA 


120 


Branchement relatif lorsque C — 1 (retenue). 
Branchement relatif lorsque Z = 1 (résultat nul). 


Positionne les indicateurs suivant le résultat de la comparaison 
bit à bit de l'opérande et de l'accumulateur. 


Branchement relatif lorsque N = 1 (résultat négatif). 
Branchement relatif lorsque Z = @ (résultat non nul). 
Branchement relatif lorsque N = @ (résultat positif). 
Break, déroutement software. 

Branchement relatif lorsque V — @ (pas d'overflow). 
Branchement relatif lorsque V = 1 (overflow). 
Positionne à @ l'indicateur C (carry). 

Positionne à @ l'indicateur D (mode décimal). 
Positionne à @ l'indicateur | (interruptions démasquées). 
Positionne à @ l'indicateur V (overflow). 


Compare l'accumulateur et l'opérande et positionne en consé- 
quence les indicateurs. 


Compare le registre X et l'opérande, positionne les indicateurs. 
Compare le registre YŸ et l'opérande, positionne les indicateurs. 
Décrémente d'une unité l'opérande. 

Décrémente d'une unité le registre X. 

Décrémente d'une unité le registre Y. 


"OÙ" exclusif bit à bit de l'opérande et l'accumulateur, le résultat 
est dans l'accumulateur. 


Incrémente l'opérande d'une unité. 
Incrémente le registre X d'une unité. 
Incrémente le registre Y d'une unité. 
Branchement absolu inconditionnel. 
Appel d'un sous-programme. 


Charge l'opérande dans l'accumulateur. 


LDX 
LDY 
LSR 


NOP 
ORA 


PHA 
PHP 
PLA 
PLP 

ROL 


ROR 


RTI 
RTS 
SBC 
SEC 
SED 
SEI 


Charge l'opérande dans le registre X. 
Charge l'opérande dans le registre Y. 


L'opérande est décalé d'un bit vers la droite. 


7 Q 
Lee 7 fe 


Pas d'opération. Ne fait rien. 


"OÙ" bit à bit de l'opérande et l'accumulateur, le résultat est dans 
l'accumulateur. 


Empile l'accumulateur. 
Empile les indicateurs (registre P). 
Dépile l'accumulateur. 
Dépile les indicateurs (registre P). 


Rotation d'un bit vers la gauche au travers de C de l'opérande. 


7 g 


Rotation d'un bit vers la droite au travers de C de l'opérande. 
7 Q 


opérande 


Retour de sous-programme de traitement d'interrruption. 
Retour de sous-programme. 

Retranche à l'accumulateur l’opérande et la carry. 
Positionne à 1 l'indicateur C (carry). 

Positionne à 1 l'indicateur D (mode décimal). 


Positionne à 1 l'indicateur | (masque les interruptions). 


121 


STA Range l'accumulateur en mémoire. 
STX Range le registre X en mémoire. 
STY Range le registre Ÿ en mémoire. 
TAX Recopie A dans X. 

TAY Recopie A dans Y. | 

TSX Recopie S (pointeur de pile) dans X. 
TXA Recopie X dans A. 

TXS Recopie X danssS. 

TYA Recopie Y dans A. 


122 








4edo 59g Jne,e1 


O = 9 !s eyoueiq 298 











x'18d0 Sy x njosqe 
42d0 Sy njosqe 
x'19d0 Sy X'019z eBed 




















































1840 Sy 019z e6ed 
1SY | 1ne)}e/nuwno9e euonef e eBe/e9ep 71Sv 
c A'(18d0) GNv A'(9811pui) 
c (X'18d0) GNv (X'19811puI) 
€ A'18d0 GNY A'nIosqe 
€ x'18d0 GNv x'njosqe 
£ 4ed0 GNY njosqe 
z x'18d0 gNy | x'0197 oed u1qe1q,13. 
t 4ed0 GNY 019z eBed 
z 18d0# ANY Jelpauiuul V+W'v aNv 
t A'(18d0) 3qv A'9811pu) 
z (X'12d0) 3qv (X‘19811pul) 
€ A'18d0 5qv A'nIosqge 
€ x'18d0 5qv x'njosqe 
£ 48d0 5qYv njosqe 
Z xX'18d0 5qv x'019z eBed 
t 4ed0 5qv 019z eBed 
t 1edo# 5 elpoui ul V+D+W+v 2av 
A QG 1 9 Z N 
Sa1IDOW oi de ee N Lu uone19d0 enbluowauyy 


SIN9]29/PU/ 


123 


RE OR 
S9IPOW 
s1N9]29/pU/ 


S19]20,p 
9/QWON 









9219 e}191/duui 
| 





sado SAg 


Om 


AW 
16 18d0 118 njosqe NN 
ve 48d0 1]g 019z e6ed W'v 


jne/81 | = AIS auyoueiq 


Q = AIS eyoueiq 





e}91duu! ]ueu8}n019p 








Jne]81 O = N!S aeuyoue1q 


Q = Z IS eyoueiq 


| = N IS aeuyoueiq 


| = Z IS euoueiq 





L — 9 IS eyoueiq 


| os. 4ed0 S5g Je/91 


sabessape p 
SIPOW 


VX3H | 1n9/quw8SSse 


9p0 axeJuAS uorne19dO 





919 


SA 


918 


148 


148 


3Ng 


IWg 





9nbIUOWaU 





124 








njosqe 
019z eBed 
jeIpeuu 





48d0 149 
48d0 149 
18d0# 1d9 






W—A IUBAINS 
sin8]e91pul Sa] euuoisod 






90 0 0 7 7Z NN 








4edo xd 
4ed0 xd) 
Jedo# xd) 


njosqe 
019z eBed 
jelpeuuil 





W—X JueAIns 
sina}e9Ipul Sa| euuorisod 





















A'(18d0) 4W9 A'(19811put) 
(X'18d0) 4W9 (X‘19811put) 
°A‘18d0 JW A'nosqge 
xX'18d0 JW x njosqe 
40d0 4W9 njosqe 
X'18d0 4W9 X'019z eBed 
48d0 4W9 019z e6ed W—vY JueaIns 





do# 4W9 Je/pauuwuI! | Sina}29IpuI Sa] auuoisod 


oyo1duu 


eyo|duu! 








S19]20,p 
9/QUON 


1n9/qu9sse 
a9XEJUAS 


sabessa1pe p 
SIPOYW 









S1N9]29/pU/ 


Ad9 


Xd9 


dW9 


A9 


M9 


UT ou 


129 


SONORE ZON XNI 








34 x'18d0 5NI 
33 18d0 SN 
94 x'18d0 5NI 
93 18d0 5N| 


A'18d0) HO3 
(xX'18d0) HO3 
A'18d0 403 
x'18d0 403 
48d0 403 
x'18d0 403 
48d0 H03 
Jedo# H03 








A3Q 


NNNMMMNAN Nm m Lun 


O œo 


x'12d0 93q 

48d0 53q 
x'18d0 593 
4840 93q 








£ _:| 3q 
€ 39 
C ga 
C 


A a I 92 Z N 
SpHIPOUI 


/n8/qwesse 


S1N9)89/PUJ EXBJUAS 


99 
S18220,p | YX3H 
9/QUON | 2p02 





eyo1duul 


x'njosqge 
njosqe 
X'019z eBed 
019z eBed 


À (19811pul) 
(X19811pul) 
A'njosqe 
x'njosqe 
njosqe 
X'019z eBed 
019z eBed 
jelpeuul 





x'njosqe 
njosqe 
xX'019z eBed 
019z eBed 










sabessaipe p 


S8POYW 


ATH TA 












1q e 11q 


JjISN|9xXe , NO. 
V+-W ® v 





AFL—A 


WEI—-W 


XNI 
ONI 
403 
A3q 
ET 
Es 


is re 


126 


e + © © 7 NN 








N°: © E 92: Z NN 
SpJIPOUI 
SIN9]22/pPU/ 


om om NNNMMMNN NNNMmm 


| 


S]9120.,P 


9/QUWON 








QT 


29 
JŸ 


89 


VX3H 
9p07 





Ado xaq7 
4ed0 xgq7 
A'18d0 xq7 
4ed0 xgq7 
Jdo# xq7 


A'(18d0) yq7 
(X'18d0) ya7 
A‘18d0 \/g7 
x'18d0 \/q7 
48d0 q7 
x'19d0 ygq7 
48d0 \7g7 
Jedo# \/q7 


4840 ySf 


(18d0) 4Wr 
48d0 af 


ANI 


1n9/qu8Sse 
exXeJ]UAS 








A'nJosqe 
njosqe 
ÀA'019z eBed 
019z eBed 
jelPeuuiI 


À (981/pul) 
(X'811pul) 
A‘nlosqe 
x'njosqe 
njosqe 
X'019z eBed 
019z eBed 
jelpauull 





)9811puI 
njosqge 


ey191duui 


sabessa1pe p 
S9POW 












xqa1 








H9d+{(z+9d) 


19d+{(L1+9d) 
+94 elidue 








H9d+(T+9d) 
19d+{(1+9d) 


vai 
EE 
ue 


127 





A'(18d0) yHyO 
(X'18d0) yyO 
A'18d0 YHO 
x'18d0 YHO 
4ed0 YO 
x'12d0 YyO 
4ed0 YO 
Jedo# YO 








NNNMMMNN | 





x'18d0 4s7 
4ed0 yS7 
x'19d0 y4S7 
48d0 yS7 
us 


















€ 98 x'19d0 4gq7 
€ 9V 1840 17 
c vg x'18d0 1g7 
z tv 18d0 1q7 
Z Ov Jdo# 17 


NŒE 92 
Sg/Ipou 


S]9120,p 
9/QUON 


1n9/qW8SSe 
axXeJUAS 





SIN9]29/pU/ 





ine}e|NnuWin99e 


sabessa1pe p 
SIpOYW 


ed v elidus | VHd 





A'(19811pui) 
(xX'19811pul) 
A‘njosqge 
x'njosqge 
njosqe 
X'019z eBed 
019z eBed 
Jelpeuuul 





1gqe3}q,. NO. 
V+ WAV 











x'njosqe 
njosqe 
X'019z eBed 
019z eBed 2}I01P R 


11q un ,p eBe/e99p HS7 





x'njosqe 
njosqe 
X'019z eBed 
019z eBed 


Jelpeuu! AW 





uone19d0 anbIuowauy 


EL 
a 
—) 


128 


a 


SÿIJIPOu 
S1N8]229/PU/ 





9 





Z 


S19)20,p 
9/QUWON 





ILE 


x'12d0 HOH 
4940 HOH 
X'18d0 HO 
18d0 HOH 
OH 


x'18d0 104 
1840 0H 
x‘18d0 104 
19d0 10H 
10H 








1Nn9/qW98SSe 
9XEJ]UAS 








ey191jduul 


x‘njosqge 
njosqe 
xX'019z eBed 
019z eBed 
ine}e|nuwn929e 


x njosqe 
njosqe 
xX'019z eBed 

019z e6ed 
in8}e|nuwin99e 


eyo1duul 





sabessa1pe p 
SIpOW 


















euwue16o1d-snos ap 1n0]91 


uol}dn11ej}u! p 1n0}91 


9HOIP € 
}1q Un p uolje]oy 


euyonef e 
11q un p uolje]o} 


d elidgp 





v el!dop 


po ame 





SLH 


ILH 











HO 














104 


did 


vi 


Q. 
L 
Q Q 


ES 


129 












AG!) ZN 


SgyIpOU 
sIN9)82/pU/ 


S19]20,p 
9/QUON 


A'(18d0) y1S 
(x'1e8d0) y1S 
A'12d0 Y1S 
x'12d0 y 1S 
48d0 \1S 
x'12d0 Y1S 
48d0 \1S 








A'edo) gs 
(X'18do) 5gs 
A'18d0 5gS 
x'18d0 5gs 
4ed0 5gs 
x'18d0 5gs 
4edo 5gs 
Jedo# 5gs 








NNNMMMNON 








1n9/qW8SSe 
SaxeJ]uAS 








A'(19811pul) 
(X'81/pul) 
A‘njosqe 
x njosqe 
njosqe 
xX'019z eBed 





019z eBed W+v Vis 
e]191duut IL ous 
eyo1duui 91 93S 





A (39811puI) 
(X9811pui) 
A'nlosqe 
x'njosqe 
njosqe 
X'019z eBed 
019z eBed 
jelpeuuil 





sabessa.pe p 


sepoyy uonje:8d0 


anbluouauy 


130 


| 
SglJIPOU 
SIN9]829/PU/ 


S29120,p 
9/QUWON 


njosqe 
X'019z eBed 
019z eBed 


4edo X1S njosqe 
A'18d0 x1S À'019z eBed 
12d0 X1S 019z eBed 


/Nn9/qW8SSe sebessaipe p 
S9XBJ]UAS SpOW 





131 


Imprimerie de la Manutention à Mayenne 
Dépôt légal: juillet 1984 
N° d’Editeur : 4150 


Après «ORIC-1 à la conquête des jeux», Voici maintenant 
_ &ATMOS à la conquête des jeux », qui reprend l'ouvrage précé- 
dent en y ajoutant toutes les améliorations de l'ATMOS. 


«ATMOS à la conquête des jeux » se propose de vous entrai- 
ner dans son univers de programmes, celui des jeux, des dessins 
en couleur, des sonorités synthétiques informatiques. Vous y 
rencontrerez une gentille petite chenille, six caméléons et quel- 
ques gloutons. Vous voyagerez dans l'espace intersidéral. Vous 
verrez la tour de Hanoï, un grand mur de briques. Vous vous 
mesurerez au Master-Mind. 


Nul doute qu'après tout cela, vous désiriez mieux connaître 
votre ATMOS et, pourquoi pas, programmer vos jeux. Pour vous 
aider et vous guider dans ce labyrinthe aux 65536 adresses, 
«ATMOS à la conquête des Jeux » vous révèle le contenu de la 
mémoire de ATMOS, comment redéfinir les caractères, tous les 
trucs des modes HIRES et TEXT, et même, mais oui, comment 
fabriquer des lignes de programme Basic avec un autre program- 
me... 


Bon amusement ! 





EYROLLES | 8706 





| see 


| CCE TES EN